/** * 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 #include #include #include #include #include #include "caffe2/core/common.h" #include 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& 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_