summaryrefslogtreecommitdiff
path: root/src/coremods/core_reloadmodule.cpp
diff options
context:
space:
mode:
authorAttila Molnar <attilamolnar@hush.com>2015-11-26 13:36:44 +0100
committerAttila Molnar <attilamolnar@hush.com>2015-11-26 13:36:44 +0100
commitc290d09c454324614a93039364fe62a7b7b75cbb (patch)
tree6c68b27d78629dfe5fa8c5aa41b760e2e9e44b40 /src/coremods/core_reloadmodule.cpp
parentbbc6a0bbbe7475e5e1d0c4f2418c6fe6e0e952b7 (diff)
Handle module reloading in core_reloadmodule entirely
Diffstat (limited to 'src/coremods/core_reloadmodule.cpp')
-rw-r--r--src/coremods/core_reloadmodule.cpp42
1 files changed, 29 insertions, 13 deletions
diff --git a/src/coremods/core_reloadmodule.cpp b/src/coremods/core_reloadmodule.cpp
index 7f0f15e77..7bf762e64 100644
--- a/src/coremods/core_reloadmodule.cpp
+++ b/src/coremods/core_reloadmodule.cpp
@@ -34,21 +34,34 @@ class CommandReloadmodule : public Command
CmdResult Handle(const std::vector<std::string>& parameters, User *user);
};
-class ReloadModuleWorker : public HandlerBase1<void, bool>
+class ReloadAction : public HandlerBase0<void>
{
+ Module* const mod;
+ const std::string uuid;
+ const std::string passedname;
+
public:
- const std::string name;
- const std::string uid;
- ReloadModuleWorker(const std::string& uuid, const std::string& modn)
- : name(modn), uid(uuid) {}
- void Call(bool result)
+ ReloadAction(Module* m, const std::string& uid, const std::string& passedmodname)
+ : mod(m)
+ , uuid(uid)
+ , passedname(passedmodname)
+ {
+ }
+
+ void Call()
{
- ServerInstance->SNO->WriteGlobalSno('a', "RELOAD MODULE: %s %ssuccessfully reloaded",
- name.c_str(), result ? "" : "un");
- User* user = ServerInstance->FindNick(uid);
+ DLLManager* dll = mod->ModuleDLLManager;
+ std::string name = mod->ModuleSourceFile;
+ ServerInstance->Modules->DoSafeUnload(mod);
+ ServerInstance->GlobalCulls.Apply();
+ delete dll;
+ bool result = ServerInstance->Modules->Load(name);
+
+ ServerInstance->SNO->WriteGlobalSno('a', "RELOAD MODULE: %s %ssuccessfully reloaded", passedname.c_str(), result ? "" : "un");
+ User* user = ServerInstance->FindUUID(uuid);
if (user)
- user->WriteNumeric(RPL_LOADEDMODULE, "%s :Module %ssuccessfully reloaded.",
- name.c_str(), result ? "" : "un");
+ user->WriteNumeric(RPL_LOADEDMODULE, "%s :Module %ssuccessfully reloaded.", passedname.c_str(), result ? "" : "un");
+
ServerInstance->GlobalCulls.AddItem(this);
}
};
@@ -63,9 +76,12 @@ CmdResult CommandReloadmodule::Handle (const std::vector<std::string>& parameter
return CMD_FAILURE;
}
- if (m)
+ if (creator->dying)
+ return CMD_FAILURE;
+
+ if ((m) && (ServerInstance->Modules.CanUnload(m)))
{
- ServerInstance->Modules->Reload(m, (creator->dying ? NULL : new ReloadModuleWorker(user->uuid, parameters[0])));
+ ServerInstance->AtomicActions.AddAction(new ReloadAction(m, user->uuid, parameters[0]));
return CMD_SUCCESS;
}
else