summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main.cpp25
-rw-r--r--src/modulemanager.cpp13
2 files changed, 16 insertions, 22 deletions
diff --git a/src/main.cpp b/src/main.cpp
index 7ec3cfe0e..380240dbb 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -133,10 +133,12 @@ void do_restart_services()
}
Log() << "Restarting";
- FOREACH_MOD(I_OnPreRestart, OnPreRestart());
-
if (quitmsg.empty())
quitmsg = "Restarting";
+
+ FOREACH_MOD(I_OnRestart, OnRestart());
+ ModuleManager::UnloadAll();
+
/* Send a quit for all of our bots */
for (Anope::insensitive_map<BotInfo *>::const_iterator it = BotListByNick.begin(), it_end = BotListByNick.end(); it != it_end; ++it)
{
@@ -150,9 +152,6 @@ void do_restart_services()
UserListByUID.erase(bi->GetUID());
}
- FOREACH_MOD(I_OnRestart, OnRestart());
-
- ModuleManager::UnloadAll();
ircdproto->SendSquit(Config->ServerName, quitmsg);
delete UplinkSock;
SocketEngine::Shutdown();
@@ -174,11 +173,13 @@ void do_restart_services()
static void services_shutdown()
{
- FOREACH_MOD(I_OnPreShutdown, OnPreShutdown());
-
if (quitmsg.empty())
quitmsg = "Terminating, reason unknown";
Log() << quitmsg;
+
+ FOREACH_MOD(I_OnShutdown, OnShutdown());
+ ModuleManager::UnloadAll();
+
if (started && UplinkSock)
{
/* Send a quit for all of our bots */
@@ -203,9 +204,6 @@ static void services_shutdown()
delete u;
}
}
- FOREACH_MOD(I_OnShutdown, OnShutdown());
- ModuleManager::UnloadAll();
- ircdproto->SendSquit(Config->ServerName, quitmsg);
delete UplinkSock;
SocketEngine::Shutdown();
@@ -225,7 +223,6 @@ void sighandler(int signum)
#else
quitmsg = Anope::string("Services terminating via signal ") + stringify(signum);
#endif
- bool fatal = false;
if (started)
{
@@ -267,17 +264,13 @@ void sighandler(int signum)
#endif
save_databases();
- services_shutdown();
+ quitting = true;
default:
- fatal = true;
break;
}
}
FOREACH_MOD(I_OnSignal, OnSignal(signum, quitmsg));
-
- if (fatal)
- throw FatalException(quitmsg);
}
/*************************************************************************/
diff --git a/src/modulemanager.cpp b/src/modulemanager.cpp
index d9d105953..ac6316728 100644
--- a/src/modulemanager.cpp
+++ b/src/modulemanager.cpp
@@ -472,16 +472,17 @@ void ModuleManager::ClearCallBacks(Module *m)
*/
void ModuleManager::UnloadAll()
{
+ std::vector<Anope::string> modules[MT_END];
+ for (std::list<Module *>::iterator it = Modules.begin(), it_end = Modules.end(); it != it_end; ++it)
+ modules[(*it)->type].push_back((*it)->name);
+
for (size_t i = MT_BEGIN + 1; i != MT_END; ++i)
- {
- for (std::list<Module *>::iterator it = Modules.begin(), it_end = Modules.end(); it != it_end; )
+ for (unsigned j = 0; j < modules[i].size(); ++j)
{
- Module *m = *it++;
-
- if (static_cast<MODType>(i) == m->type)
+ Module *m = FindModule(modules[i][j]);
+ if (m != NULL)
UnloadModule(m, NULL);
}
- }
}
/** Register a service