|
Field3D
|
This class provides methods for loading Field plugins from disk. More...
#include <PluginLoader.h>
Public Member Functions | |
| PluginLoader () | |
| Default constructor. | |
| ~PluginLoader () | |
| Destructor. | |
Static Public Member Functions | |
| static void | loadPlugins () |
| Checks all paths in $FIELD3D_DSO_PATH and loads the plugins it finds. | |
Static Private Attributes | |
| static std::vector< std::string > | ms_pluginsLoaded |
| List of plugins loaded. | |
This class provides methods for loading Field plugins from disk.
Definition at line 68 of file PluginLoader.h.
| PluginLoader::PluginLoader | ( | ) |
| PluginLoader::~PluginLoader | ( | ) |
| void PluginLoader::loadPlugins | ( | ) | [static] |
Checks all paths in $FIELD3D_DSO_PATH and loads the plugins it finds.
Definition at line 163 of file PluginLoader.cpp.
References getDirSos(), Msg::print(), Msg::SevWarning, and ClassFactory::singleton().
Referenced by ClassFactory::ClassFactory().
{
// Get environment variable
char *cptr = getenv("FIELD3D_DSO_PATH");
if (!cptr)
return;
std::string path = cptr;
// Split paths
std::vector<std::string> paths;
const std::string delimiters = ":";
tokenize(path, delimiters, paths);
// For each path
for (unsigned int i = 0; i < paths.size(); i++) {
// List the contents of the directory
std::vector<std::string> sos;
if (!getDirSos(sos,paths[i])) {
continue;
}
// Open each file
for (unsigned int j = 0; j < sos.size(); j++) {
std::string sofile = sos[j];
//First check to see if a plugin of the same name has already been loaded
const std::string pathDelimiter = "/";
std::vector<std::string> pluginName;
tokenize(sofile, pathDelimiter, pluginName);
bool pluginAlreadyLoaded = false;
for (unsigned int i = 0; i < ms_pluginsLoaded.size(); i++) {
if (pluginName.size() > 0) {
if (ms_pluginsLoaded[i] == pluginName[pluginName.size() - 1]) {
//This plugin has been loaded so look for another one
//std::cout << ms_pluginsLoaded[i] << " is already loaded\n";
pluginAlreadyLoaded = true;
break;
}
}
}
if (pluginAlreadyLoaded) {
continue;
}
if (pluginName.size() > 0) {
std::string lastName = pluginName[pluginName.size() -1];
ms_pluginsLoaded.push_back(lastName);
}
// Attempt to load .so file
void *handle = dlopen(sofile.c_str(), RTLD_GLOBAL|RTLD_NOW);
if (!handle) {
std::cout <<
"Field3D Plugin loader: failed to load plugin: " << dlerror() << "\n";
continue;
}
// Determine plugin type by looking for one of:
// registerField3DPlugin()
int (*fptr)(ClassFactory &) = NULL;
fptr = (int (*)(ClassFactory&))
dlsym(handle,"registerField3DPlugin");
std::string msg = "Initialized Field3D Plugin " + sofile;
char *dlsymError = dlerror();
if (!dlsymError) {
if (fptr) {
// Call the registration function
int res = (*fptr)(ClassFactory::singleton());
if (!res) {
Msg::print(Msg::SevWarning,
"failed to init Field3D plugin " + sofile);
} else {
Msg::print(msg);
}
}
} else {
char *debugEnvVar = getenv("FIELD3D_DEBUG");
if (debugEnvVar) {
// debug env var exist, so print warning
Msg::print(Msg::SevWarning,
"Field3D plugin loader: failed to load "
"the symbol registerField3DPlugin");
}
}
}
}
}
FIELD3D_NAMESPACE_OPEN std::vector< std::string > PluginLoader::ms_pluginsLoaded [static, private] |
List of plugins loaded.
Definition at line 96 of file PluginLoader.h.