summaryrefslogtreecommitdiffstats
path: root/src/Common/ModuleManager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Common/ModuleManager.cpp')
-rw-r--r--src/Common/ModuleManager.cpp43
1 files changed, 27 insertions, 16 deletions
diff --git a/src/Common/ModuleManager.cpp b/src/Common/ModuleManager.cpp
index 74c424d..67a1b14 100644
--- a/src/Common/ModuleManager.cpp
+++ b/src/Common/ModuleManager.cpp
@@ -26,12 +26,16 @@
#include <Core/ConfigEntry.h>
#include <Core/ConfigManager.h>
+#include <modules/modules.h>
+
#include <dlfcn.h>
namespace Mad {
namespace Common {
+const ModuleManager::ModuleHandle ModuleManager::STATIC_MODULE = 0;
+
ModuleManager::ModuleManager(Application *application0) : application(application0) {
application->getConfigManager()->registerConfigurable(this);
}
@@ -73,26 +77,31 @@ bool ModuleManager::loadModule(const std::string &name) {
return true;
}
- ModuleHandle handle = dlopen((name + MODULE_SUFFIX).c_str(), RTLD_NOW | RTLD_GLOBAL);
+ ModuleHandle handle = STATIC_MODULE;
+ Module *mod = Modules::loadStaticModule(application, name);
- if(!handle) {
- application->log(Core::LoggerBase::VERBOSE, std::string("loadModule: Can't open module: ") + std::string(dlerror()));
- return false;
- }
+ if(!mod) {
+ handle = dlopen((name + MODULE_SUFFIX).c_str(), RTLD_NOW | RTLD_GLOBAL);
- ModuleLoadFunc loader;
- *(void**)&loader = dlsym(handle, (name + "_create").c_str());
+ if(!handle) {
+ application->log(Core::LoggerBase::VERBOSE, std::string("loadModule: Can't open module: ") + std::string(dlerror()));
+ return false;
+ }
- if(!loader) {
- application->log(Core::LoggerBase::VERBOSE, "loadModule: Can't open module: Invalid module");
- return false;
- }
+ ModuleLoadFunc loader;
+ *(void**)&loader = dlsym(handle, (name + "_create").c_str());
- Module *mod = loader(application);
+ if(!loader) {
+ application->log(Core::LoggerBase::VERBOSE, "loadModule: Can't open module: Invalid module");
+ return false;
+ }
- if(!mod) {
- application->log(Core::LoggerBase::VERBOSE, "loadModule: Can't open module: Internal module error");
- return false;
+ Module *mod = loader(application);
+
+ if(!mod) {
+ application->log(Core::LoggerBase::VERBOSE, "loadModule: Can't open module: Internal module error");
+ return false;
+ }
}
modules.insert(std::make_pair(name, std::make_pair(handle, mod))).first;
@@ -111,7 +120,9 @@ void ModuleManager::unloadModule(const std::string &name) {
boost::upgrade_to_unique_lock<boost::shared_mutex> upgradeLock(lock);
delete mod->second.second;
- dlclose(mod->second.first);
+
+ if(mod->second.first != STATIC_MODULE)
+ dlclose(mod->second.first);
modules.erase(mod);
}