]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/inspircd.cpp
This file *BROKEN AGAIN* in windows builds (VC9) - uint_16t and uint_32t do not exist...
[user/henk/code/inspircd.git] / src / inspircd.cpp
index e6b86359127ab60e75dad3af5d38b6f12a63997f..23ef19aef771a969ffc71039882c4efafacf0ec0 100644 (file)
@@ -11,6 +11,7 @@
  * ---------------------------------------------------
  */
 
+/* $Core */
 /* $Install: src/inspircd $(BINPATH) */
 #include "inspircd.h"
 #include <signal.h>
@@ -151,8 +152,6 @@ void InspIRCd::Cleanup()
        /* Close logging */
        this->Logs->CloseLogs();
        DeleteZero(this->Logs);
-
-       delete RehashFinishMutex;
 }
 
 void InspIRCd::Restart(const std::string &reason)
@@ -327,7 +326,6 @@ InspIRCd::InspIRCd(int argc, char** argv)
         HandleProcessUser(this),
         HandleIsNick(this),
         HandleIsIdent(this),
-        HandleFindDescriptor(this),
         HandleFloodQuitUser(this),
         HandleIsChannel(this),
         HandleIsSID(this),
@@ -344,7 +342,6 @@ InspIRCd::InspIRCd(int argc, char** argv)
         Rehash(&HandleRehash),
         IsNick(&HandleIsNick),
         IsIdent(&HandleIsIdent),
-        FindDescriptor(&HandleFindDescriptor),
         FloodQuitUser(&HandleFloodQuitUser)
 
 {
@@ -359,7 +356,7 @@ InspIRCd::InspIRCd(int argc, char** argv)
        FailedPortList pl;
        int do_version = 0, do_nofork = 0, do_debug = 0,
            do_nolog = 0, do_root = 0, do_testsuite = 0;    /* flag variables */
-       char c = 0;
+       int c = 0;
 
        // Initialize so that if we exit before proper initialization they're not deleted
        this->Logs = 0;
@@ -391,10 +388,7 @@ InspIRCd::InspIRCd(int argc, char** argv)
        SE = SEF->Create(this);
        delete SEF;
 
-       ThreadEngineFactory* tef = new ThreadEngineFactory();
-       this->Threads = tef->Create(this);
-       delete tef;
-       this->Mutexes = new MutexFactory(this);
+       this->Threads = new ThreadEngine(this);
 
        /* Default implementation does nothing */
        this->PI = new ProtocolInterface(this);
@@ -450,7 +444,8 @@ InspIRCd::InspIRCd(int argc, char** argv)
                { 0, 0, 0, 0 }
        };
 
-       while ((c = getopt_long_only(argc, argv, ":f:", longopts, NULL)) != -1)
+       int index;
+       while ((c = getopt_long_only(argc, argv, ":f:", longopts, &index)) != -1)
        {
                switch (c)
                {
@@ -465,8 +460,11 @@ InspIRCd::InspIRCd(int argc, char** argv)
                        case 0:
                                /* getopt_long_only() set an int variable, just keep going */
                        break;
+                       case '?':
+                               /* Unknown parameter */
                        default:
-                               /* Unknown parameter! DANGER, INTRUDER.... err.... yeah. */
+                               /* Fall through to handle other weird values too */
+                               printf("Unknown parameter '%s'\n", argv[index]);
                                printf("Usage: %s [--nofork] [--nolog] [--debug] [--logfile <filename>]\n\
                                                  [--runasroot] [--version] [--config <config>] [--testsuite]\n", argv[0]);
                                Exit(EXIT_STATUS_ARGV);
@@ -612,8 +610,8 @@ InspIRCd::InspIRCd(int argc, char** argv)
        }
 
        /* set up fake client again this time with the correct uid */
-       this->FakeClient = new User(this, "#INVALID");
-       this->FakeClient->SetFd(FD_MAGIC_NUMBER);
+       this->FakeClient = new FakeUser(this, "!");
+       this->FakeClient->SetFakeServer(Config->ServerName);
 
        // Get XLine to do it's thing.
        this->XLines->CheckELines();
@@ -756,8 +754,6 @@ int InspIRCd::Run()
                Exit(0);
        }
 
-       RehashFinishMutex = Mutexes->CreateMutex();
-
        while (true)
        {
 #ifndef WIN32
@@ -769,8 +765,7 @@ int InspIRCd::Run()
 #endif
 
                /* Check if there is a config thread which has finished executing but has not yet been freed */
-               RehashFinishMutex->Lock();
-               if (this->ConfigThread && this->ConfigThread->GetExitFlag())
+               if (this->ConfigThread && this->ConfigThread->IsDone())
                {
                        /* Rehash has completed */
 
@@ -780,11 +775,9 @@ int InspIRCd::Run()
 
                        this->Logs->Log("CONFIG",DEBUG,"Detected ConfigThread exiting, tidying up...");
 
-                       /* These are currently not known to be threadsafe, so they are executed outside
-                        * of the thread. It would be pretty simple to move them to the thread Run method
-                        * once they are known threadsafe with all the correct mutexes in place. This might
-                        * not be worth the effort however as these functions execute relatively quickly
-                        * and would not benefit from being within the config read thread.
+                       /*
+                        * Apply the changed configuration from the rehash. This is not done within the
+                        * configuration thread becasuse they may invoke functions that are not threadsafe.
                         *
                         * XXX: The order of these is IMPORTANT, do not reorder them without testing
                         * thoroughly!!!
@@ -795,17 +788,12 @@ int InspIRCd::Run()
                        this->ResetMaxBans();
                        InitializeDisabledCommands(Config->DisabledCommands, this);
                        User* user = !Config->RehashUserUID.empty() ? FindNick(Config->RehashUserUID) : NULL;
-                       FOREACH_MOD_I(this, I_OnRehash, OnRehash(user, Config->RehashParameter));
+                       FOREACH_MOD_I(this, I_OnRehash, OnRehash(user));
                        this->BuildISupport();
 
-                       /* IMPORTANT: This delete may hang if you fuck up your thread syncronization.
-                        * It will hang waiting for the ConfigThread to 'join' to avoid race conditons,
-                        * until the other thread is completed.
-                        */
                        delete ConfigThread;
                        ConfigThread = NULL;
                }
-               RehashFinishMutex->Unlock();
 
                /* time() seems to be a pretty expensive syscall, so avoid calling it too much.
                 * Once per loop iteration is pleanty.