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];
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.
*/
}
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
* 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
}
catch (ModuleException& modexcept)
{
- log(DEBUG,"Module exception cought: %s",modexcept.GetReason()); \
+ log(DEBUG,"Module exception cought: %s",modexcept.GetReason());
}
}
stats->statsAccept++;
* what we would do, so for now, its going
* to safely do bugger all.
*/
+ SE->DelFd(activefds[activefd]);
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
/* main loop, this never returns */
expire_run = false;
+ yield_depth = 0;
+ iterations = 0;
while (true)
{