From b180d5f975b3fd9a096a712adf9589c360831f72 Mon Sep 17 00:00:00 2001 From: Adam Date: Tue, 17 Aug 2010 22:19:36 -0400 Subject: Always unload socketengines/database/protocl etc modules last, and fixed a potential crash in m_mysql when unloading when not in GDB --- src/main.cpp | 8 ++------ src/modulemanager.cpp | 14 ++++++++------ 2 files changed, 10 insertions(+), 12 deletions(-) (limited to 'src') diff --git a/src/main.cpp b/src/main.cpp index 8132e9d1c..df7c61c63 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -189,9 +189,7 @@ void do_restart_services() SocketEngine->Process(); delete UplinkSock; close_log(); - /* First don't unload protocol module, then do so */ - ModuleManager::UnloadAll(false); - ModuleManager::UnloadAll(true); + ModuleManager::UnloadAll(); chdir(binary_dir.c_str()); execve(services_bin.c_str(), my_av, my_envp); if (!readonly) @@ -238,9 +236,7 @@ static void services_shutdown() SocketEngine->Process(); delete UplinkSock; FOREACH_MOD(I_OnShutdown, OnShutdown()); - /* First don't unload protocol module, then do so */ - ModuleManager::UnloadAll(false); - ModuleManager::UnloadAll(true); + ModuleManager::UnloadAll(); /* just in case they weren't all removed at least run once */ ModuleRunTimeDirCleanUp(); } diff --git a/src/modulemanager.cpp b/src/modulemanager.cpp index b5f0d51f2..f539f273d 100644 --- a/src/modulemanager.cpp +++ b/src/modulemanager.cpp @@ -419,16 +419,18 @@ void ModuleManager::ClearCallBacks(Module *m) /** Unloading all modules, NEVER call this when Anope isn't shutting down. * Ever. - * @param unload_proto true to unload the protocol module */ -void ModuleManager::UnloadAll(bool unload_proto) +void ModuleManager::UnloadAll() { - for (std::list::iterator it = Modules.begin(), it_end = Modules.end(); it != it_end; ) + for (size_t i = MT_BEGIN + 1; i != MT_END; ++i) { - Module *m = *it++; + for (std::list::iterator it = Modules.begin(), it_end = Modules.end(); it != it_end; ) + { + Module *m = *it++; - if (unload_proto || m->type != PROTOCOL) - DeleteModule(m); + if (static_cast(i) == m->type) + DeleteModule(m); + } } } -- cgit