extern int MODCOUNT;
extern char LOG_FILE[MAXBUF];
int openSockfd[MAXSOCKS];
+int yield_depth;
+int iterations = 0;
sockaddr_in client,server;
socklen_t length;
user_hash clientlist;
chan_hash chanlist;
-whowas_hash whowas;
+
servernamelist servernames;
char lowermap[255];
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()
#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;
}
void InspIRCd::DoOneIteration(bool process_module_sockets)
{
- bool expire_run = false;
int activefds[MAX_DESCRIPTORS];
int incomingSockfd;
int in_port;
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.
*/
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.
*/
- DoSocketTimeouts(TIME);
+ if (process_module_sockets)
+ DoSocketTimeouts(TIME);
TickTimers(TIME);
* 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
case X_ESTAB_MODULE:
if (!process_module_sockets)
- return;
+ break;
/* Process module-owned sockets.
* Modules are encouraged to inherit their sockets from
break;
}
}
+ yield_depth--;
}
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
WritePID(Config->PID);
/* main loop, this never returns */
+ expire_run = false;
+ yield_depth = 0;
+ iterations = 0;
+
while (true)
{
DoOneIteration(true);