diff options
author | brain <brain@e03df62e-2008-0410-955e-edbf42e46eb7> | 2006-03-07 10:25:40 +0000 |
---|---|---|
committer | brain <brain@e03df62e-2008-0410-955e-edbf42e46eb7> | 2006-03-07 10:25:40 +0000 |
commit | 148835bea39a0a28625bdab7c7c1a709876b76aa (patch) | |
tree | 3ee02b24b685ef02d3cc8c21b0a82886639cd8ff /src/inspircd.cpp | |
parent | 16a56843b0bc40a813c1bcb275141249ca6eed0b (diff) |
Added a 'max depth' to stop recursive issue
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@3507 e03df62e-2008-0410-955e-edbf42e46eb7
Diffstat (limited to 'src/inspircd.cpp')
-rw-r--r-- | src/inspircd.cpp | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/src/inspircd.cpp b/src/inspircd.cpp index 253c2246b..eae26c64e 100644 --- a/src/inspircd.cpp +++ b/src/inspircd.cpp @@ -72,6 +72,7 @@ std::vector<userrec*> local_users; extern int MODCOUNT; extern char LOG_FILE[MAXBUF]; int openSockfd[MAXSOCKS]; +int yield_depth; sockaddr_in client,server; socklen_t length; @@ -602,6 +603,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. */ @@ -634,6 +640,7 @@ void InspIRCd::DoOneIteration(bool process_module_sockets) } TickMissedTimers(TIME); expire_run = true; + yield_depth--; return; } else if ((TIME % 5) == 1) @@ -665,7 +672,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 @@ -778,6 +788,7 @@ void InspIRCd::DoOneIteration(bool process_module_sockets) break; } } + yield_depth--; } int InspIRCd::Run() @@ -804,6 +815,7 @@ int InspIRCd::Run() /* main loop, this never returns */ expire_run = false; + yield_depth = 0; while (true) { |