diff options
author | danieldg <danieldg@e03df62e-2008-0410-955e-edbf42e46eb7> | 2010-01-17 03:17:25 +0000 |
---|---|---|
committer | danieldg <danieldg@e03df62e-2008-0410-955e-edbf42e46eb7> | 2010-01-17 03:17:25 +0000 |
commit | 88b9ecb6b34d268f0761e6e961408871b6e91376 (patch) | |
tree | 48b0c305e29a251abee091e839dc402218579926 /src/modmanager_static.cpp | |
parent | 5de7651ebeee56e6deca4d5e357b22869719bb8f (diff) |
PURE_STATIC improvements: Allow modules to be reloaded, generate linker arguments
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@12276 e03df62e-2008-0410-955e-edbf42e46eb7
Diffstat (limited to 'src/modmanager_static.cpp')
-rw-r--r-- | src/modmanager_static.cpp | 50 |
1 files changed, 40 insertions, 10 deletions
diff --git a/src/modmanager_static.cpp b/src/modmanager_static.cpp index e09310a13..322703679 100644 --- a/src/modmanager_static.cpp +++ b/src/modmanager_static.cpp @@ -58,28 +58,58 @@ class AllModule : public Module MODULE_INIT(AllModule) -bool ModuleManager::Load(const char* filename) +bool ModuleManager::Load(const char* name) { + for(std::vector<AllModuleList*>::iterator i = modlist->begin(); i != modlist->end(); ++i) + { + if ((**i).name == name) + { + try + { + Module* c = (*(**i).init)(); + Modules[name] = c; + FOREACH_MOD(I_OnLoadModule,OnLoadModule(c)); + return true; + } + catch (CoreException& modexcept) + { + ServerInstance->Logs->Log("MODULE", DEFAULT, "Unable to load " + (**i).name + ": " + modexcept.GetReason()); + } + } + } return false; } -bool ModuleManager::CanUnload(Module* mod) +bool ModuleManager::Unload(Module* mod) { return false; } -void ModuleManager::DoSafeUnload(Module* mod) -{ -} - -bool ModuleManager::Unload(Module* mod) -{ - return false; +namespace { + struct ReloadAction : public HandlerBase0<void> + { + Module* const mod; + HandlerBase1<void, bool>* const callback; + ReloadAction(Module* m, HandlerBase1<void, bool>* c) + : mod(m), callback(c) {} + void Call() + { + std::string name = mod->ModuleSourceFile; + ServerInstance->Modules->DoSafeUnload(mod); + ServerInstance->GlobalCulls.Apply(); + bool rv = ServerInstance->Modules->Load(name.c_str()); + callback->Call(rv); + ServerInstance->GlobalCulls.AddItem(this); + } + }; } void ModuleManager::Reload(Module* mod, HandlerBase1<void, bool>* callback) { - callback->Call(false); + if (CanUnload(mod)) + ServerInstance->AtomicActions.AddAction(new ReloadAction(mod, callback)); + else + callback->Call(false); } void ModuleManager::LoadAll() |