/**
|
* A global dictionary that holds information about what Caffe2 modules have
|
* been loaded in the current runtime, and also utility functions to load
|
* modules.
|
*/
|
#ifndef CAFFE2_CORE_MODULE_H_
|
#define CAFFE2_CORE_MODULE_H_
|
|
#include <algorithm>
|
#include <cstdio>
|
#include <cstdlib>
|
#include <functional>
|
#include <memory>
|
#include <mutex>
|
|
#include "caffe2/core/common.h"
|
#include <c10/util/typeid.h>
|
|
namespace caffe2 {
|
|
/**
|
* A module schema that can be used to store specific information about
|
* different modules. Currently, we only store the name and a simple
|
* description of what this module does.
|
*/
|
class CAFFE2_API ModuleSchema {
|
public:
|
ModuleSchema(const char* name, const char* description);
|
};
|
|
|
/**
|
* @brief Current Modules present in the Caffe2 runtime.
|
* Returns:
|
* map: a map of modules and (optionally) their description. The key is the
|
* module name, and the value is the description for that module. The
|
* module name is recommended to be the part that constitutes the trunk
|
* of the dynamic library: for example, a module called
|
* libcaffe2_db_rocksdb.so should have the name "caffe2_db_rocksdb". The
|
* reason we do not use "lib" is because it's somewhat redundant, and
|
* the reason we do not include ".so" is for cross-platform compatibility
|
* on platforms like mac os.
|
*/
|
CAFFE2_API const CaffeMap<string, const ModuleSchema*>& CurrentModules();
|
|
/**
|
* @brief Checks whether a module is already present in the current binary.
|
*/
|
CAFFE2_API bool HasModule(const string& name);
|
|
/**
|
* @brief Load a module.
|
* Inputs:
|
* name: a module name or a path name.
|
* It is recommended that you use the name of the module, and leave the
|
* full path option to only experimental modules.
|
* filename: (optional) a filename that serves as a hint to load the module.
|
*/
|
CAFFE2_API void LoadModule(const string& name, const string& filename="");
|
|
|
#define CAFFE2_MODULE(name, description) \
|
extern "C" { \
|
bool gCaffe2ModuleSanityCheck##name() { return true; } \
|
} \
|
namespace { \
|
static ::caffe2::ModuleSchema module_schema_##name(#name, description); \
|
}
|
|
} // namespace caffe2
|
#endif // CAFFE2_CORE_MODULE_H_
|