]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/inspircd.cpp
Align names that are output on startup using \t htabs
[user/henk/code/inspircd.git] / src / inspircd.cpp
index a070e5099436e67251ca367c388fd2884751f7eb..9b48d83ef4dc85b5efa2af17c96490f3a1169aba 100644 (file)
@@ -72,6 +72,8 @@ std::vector<userrec*> local_users;
 extern int MODCOUNT;
 extern char LOG_FILE[MAXBUF];
 int openSockfd[MAXSOCKS];
+int yield_depth;
+int iterations = 0;
 sockaddr_in client,server;
 socklen_t length;
 
@@ -89,7 +91,7 @@ ServerConfig *Config = new ServerConfig;
 
 user_hash clientlist;
 chan_hash chanlist;
-whowas_hash whowas;
+
 servernamelist servernames;
 char lowermap[255];
 
@@ -127,21 +129,7 @@ bool FindServerName(std::string servername)
 
 std::string InspIRCd::GetRevision()
 {
-       /* w00t got me to replace a bunch of strtok_r
-        * with something nicer, so i did this. Its the
-        * same thing really, only in C++. It places the
-        * text into a std::stringstream which is a readable
-        * and writeable buffer stream, and then pops two
-        * words off it, space delimited. Because it reads
-        * into the same variable twice, the first word
-        * is discarded, and the second one returned.
-        */
-
-       /* XXX - this revision ID is NOT bumping automatically -- w00t */
-       std::stringstream Revision("$Revision$");
-       std::string single;
-       Revision >> single >> single;
-       return single;
+       return REVISION;
 }
 
 void InspIRCd::MakeLowerMap()
@@ -251,11 +239,11 @@ std::string InspIRCd::GetVersionString()
 #endif
        if (*Config->CustomVersion)
        {
-               snprintf(versiondata,MAXBUF,"%s Rev. %s %s :%s",VERSION,GetRevision().c_str(),Config->ServerName,Config->CustomVersion);
+               snprintf(versiondata,MAXBUF,"%s %s :%s",VERSION,Config->ServerName,Config->CustomVersion);
        }
        else
        {
-               snprintf(versiondata,MAXBUF,"%s Rev. %s %s :%s [FLAGS=%lu,%s,%s]",VERSION,GetRevision().c_str(),Config->ServerName,SYSTEM,(unsigned long)OPTIMISATION,SE->GetName().c_str(),dnsengine);
+               snprintf(versiondata,MAXBUF,"%s %s :%s [FLAGS=%lu,%s,%s]",VERSION,Config->ServerName,SYSTEM,(unsigned long)OPTIMISATION,SE->GetName().c_str(),dnsengine);
        }
        return versiondata;
 }
@@ -606,7 +594,6 @@ bool InspIRCd::LoadModule(const char* filename)
 
 void InspIRCd::DoOneIteration(bool process_module_sockets)
 {
-        bool expire_run = false;
         int activefds[MAX_DESCRIPTORS];
         int incomingSockfd;
         int in_port;
@@ -617,6 +604,11 @@ void InspIRCd::DoOneIteration(bool process_module_sockets)
         sockaddr_in sock_us;     // our port number
         socklen_t uslen;         // length of our port number
 
+       if (yield_depth > 3)
+               return;
+
+       yield_depth++;
+
         /* time() seems to be a pretty expensive syscall, so avoid calling it too much.
          * Once per loop iteration is pleanty.
          */
@@ -631,30 +623,55 @@ void InspIRCd::DoOneIteration(bool process_module_sockets)
         if (((TIME % 5) == 0) && (!expire_run))
         {
                 expire_lines();
-                FOREACH_MOD(I_OnBackgroundTimer,OnBackgroundTimer(TIME));
+               if (process_module_sockets)
+               {
+                       /* Fix by brain - the addition of DoOneIteration means that this
+                        * can end up getting called recursively in the following pattern:
+                        *
+                        * m_spanningtree DoPingChecks
+                        * (server pings out and is squit)
+                        * (squit causes call to DoOneIteration)
+                        * DoOneIteration enters here
+                        * calls DoBackground timer
+                        * enters m_spanningtree DoPingChecks... see step 1.
+                        *
+                        * This should do the job and fix the bug.
+                        */
+                       FOREACH_MOD(I_OnBackgroundTimer,OnBackgroundTimer(TIME));
+               }
                 TickMissedTimers(TIME);
                 expire_run = true;
+               yield_depth--;
                 return;
         }   
         else if ((TIME % 5) == 1)
         {
                 expire_run = false;
         }
+
+       if (iterations++ == 15)
+       {
+               iterations = 0;
+               DoBackgroundUserStuff(TIME);
+       }
  
         /* Once a second, do the background processing */
         if (TIME != OLDTIME)
         {
                 if (TIME < OLDTIME)
                         WriteOpers("*** \002EH?!\002 -- Time is flowing BACKWARDS in this dimension! Clock drifted backwards %d secs.",abs(OLDTIME-TIME));
-                DoBackgroundUserStuff(TIME);
+               if ((TIME % 3600) == 0)
+               {
+                       MaintainWhoWas(TIME);
+               }
         }
-               
+
         /* Process timeouts on module sockets each time around
          * the loop. There shouldnt be many module sockets, at
          * most, 20 or so, so this won't be much of a performance
          * hit at all.   
          */ 
-       if (!process_module_sockets)
+       if (process_module_sockets)
                DoSocketTimeouts(TIME);  
          
         TickTimers(TIME);
@@ -665,7 +682,10 @@ void InspIRCd::DoOneIteration(bool process_module_sockets)
          * servers... so its nice and easy, just one call.
          */
         if (!(numberactive = SE->Wait(activefds)))
+       {
+               yield_depth--;
                 return;
+       }
 
         /**
          * Now process each of the fd's. For users, we have a fast
@@ -690,7 +710,7 @@ void InspIRCd::DoOneIteration(bool process_module_sockets)
                         case X_ESTAB_MODULE:
 
                                if (!process_module_sockets)
-                                       return;
+                                       break;
 
                                 /* Process module-owned sockets.
                                  * Modules are encouraged to inherit their sockets from
@@ -753,7 +773,7 @@ void InspIRCd::DoOneIteration(bool process_module_sockets)
                                                 }
                                                 catch (ModuleException& modexcept)
                                                 {
-                                                        log(DEBUG,"Module exception cought: %s",modexcept.GetReason()); \
+                                                        log(DEBUG,"Module exception cought: %s",modexcept.GetReason());
                                                 }
                                         }
                                         stats->statsAccept++;
@@ -775,9 +795,11 @@ void InspIRCd::DoOneIteration(bool process_module_sockets)
                                  * what we would do, so for now, its going
                                  * to safely do bugger all.
                                  */
+                               SE->DelFd(activefds[activefd]);
                         break;
                 }
         }
+       yield_depth--;
 }
 
 int InspIRCd::Run()
@@ -790,8 +812,9 @@ int InspIRCd::Run()
        
        if (!Config->nofork)
        {
-               freopen("/dev/null","w",stdout);
-               freopen("/dev/null","w",stderr);
+               fclose(stdout);
+               fclose(stderr);
+               fclose(stdin);
        }
 
        /* Add the listening sockets used for client inbound connections
@@ -803,6 +826,10 @@ int InspIRCd::Run()
        WritePID(Config->PID);
 
        /* main loop, this never returns */
+       expire_run = false;
+       yield_depth = 0;
+       iterations = 0;
+
        while (true)
        {
                DoOneIteration(true);