]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/inspircd.cpp
Move some local-only fields to LocalUser
[user/henk/code/inspircd.git] / src / inspircd.cpp
index b8b51d2cd6e4503673a7ba664c49d32c5e1d7cd7..ca6a59cacb3137edd4c2a466595f3c2884ffe39c 100644 (file)
@@ -83,53 +83,36 @@ const char* ExitCodes[] =
 
 template<typename T> static void DeleteZero(T*&n)
 {
-       if (n != NULL)
-       {
-               delete n;
-               n = NULL;
-       }
+       T* t = n;
+       n = NULL;
+       delete t;
 }
 
 void InspIRCd::Cleanup()
 {
-       if (Config)
+       for (unsigned int i = 0; i < ports.size(); i++)
        {
-               for (unsigned int i = 0; i < ports.size(); i++)
-               {
-                       /* This calls the constructor and closes the listening socket */
-                       delete ports[i];
-               }
-
-               ports.clear();
+               /* This calls the constructor and closes the listening socket */
+               ports[i]->cull();
+               delete ports[i];
        }
+       ports.clear();
 
        /* Close all client sockets, or the new process inherits them */
-       std::vector<User*>::reverse_iterator i = Users->local_users.rbegin();
+       std::vector<LocalUser*>::reverse_iterator i = Users->local_users.rbegin();
        while (i != this->Users->local_users.rend())
        {
                User* u = *i++;
                Users->QuitUser(u, "Server shutdown");
        }
 
-       /* We do this more than once, so that any service providers get a
-        * chance to be unhooked by the modules using them, but then get
-        * a chance to be removed themsleves.
-        *
-        * XXX there may be a better way to do this
-        */
-       for (int tries = 0; tries < 4; tries++)
-       {
-               std::vector<std::string> module_names = Modules->GetAllModuleNames(0);
-               for (std::vector<std::string>::iterator k = module_names.begin(); k != module_names.end(); ++k)
-               {
-                       /* Unload all modules, so they get a chance to clean up their listeners */
-                       this->Modules->Unload(k->c_str());
-               }
-               GlobalCulls.Apply();
-       }
+       GlobalCulls.Apply();
+       Modules->UnloadAll();
 
        /* Delete objects dynamically allocated in constructor (destructor would be more appropriate, but we're likely exiting) */
        /* Must be deleted before modes as it decrements modelines */
+       if (FakeClient)
+               FakeClient->cull();
        DeleteZero(this->FakeClient);
        DeleteZero(this->Users);
        DeleteZero(this->Modes);
@@ -328,8 +311,8 @@ InspIRCd::InspIRCd(int argc, char** argv) :
 
        ServerInstance = this;
 
-       Extensible::Register(&NICKForced);
-       Extensible::Register(&OperQuit);
+       Extensions.Register(&NICKForced);
+       Extensions.Register(&OperQuit);
 
        FailedPortList pl;
        int do_version = 0, do_nofork = 0, do_debug = 0,
@@ -788,7 +771,8 @@ int InspIRCd::Run()
                this->SE->DispatchEvents();
 
                /* if any users were quit, take them out */
-               this->GlobalCulls.Apply();
+               GlobalCulls.Apply();
+               AtomicActions.Run();
 
                if (this->s_signal)
                {