diff options
author | brain <brain@e03df62e-2008-0410-955e-edbf42e46eb7> | 2006-02-26 20:22:43 +0000 |
---|---|---|
committer | brain <brain@e03df62e-2008-0410-955e-edbf42e46eb7> | 2006-02-26 20:22:43 +0000 |
commit | f5c28c5e69f2d179eb54c5904d33d585b4e92a4e (patch) | |
tree | 9003febf35f7840ebc4885aca297b393868d2056 /src | |
parent | 65d0d4fb366ef527f7bde471fc809d48fc26ccf2 (diff) |
Yields back to user processing to give users a chance to issue commands during heavy server congestion (not yet tested)
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@3343 e03df62e-2008-0410-955e-edbf42e46eb7
Diffstat (limited to 'src')
-rw-r--r-- | src/modules/m_spanningtree.cpp | 54 |
1 files changed, 51 insertions, 3 deletions
diff --git a/src/modules/m_spanningtree.cpp b/src/modules/m_spanningtree.cpp index 7dda3e7f3..20c86f705 100644 --- a/src/modules/m_spanningtree.cpp +++ b/src/modules/m_spanningtree.cpp @@ -74,7 +74,7 @@ class ModuleSpanningTree; static ModuleSpanningTree* TreeProtocolModule; extern ServerConfig* Config; - +extern InspIRCd* ServerInstance; extern std::vector<Module*> modules; extern std::vector<ircd_module*> factory; extern int MODCOUNT; @@ -1209,41 +1209,73 @@ class TreeSocket : public InspSocket { snprintf(data,MAXBUF,":%s ADDLINE Z %s %s %lu %lu :%s",sn,i->ipaddr,i->source,(unsigned long)i->set_time,(unsigned long)i->duration,i->reason); this->WriteLine(data); + if ((i % 20) == 0) + { + ServerInstance->DoOneIteration(false); + } } for (std::vector<QLine>::iterator i = qlines.begin(); i != qlines.end(); i++) { snprintf(data,MAXBUF,":%s ADDLINE Q %s %s %lu %lu :%s",sn,i->nick,i->source,(unsigned long)i->set_time,(unsigned long)i->duration,i->reason); this->WriteLine(data); + if ((i % 20) == 0) + { + ServerInstance->DoOneIteration(false); + } } for (std::vector<GLine>::iterator i = glines.begin(); i != glines.end(); i++) { snprintf(data,MAXBUF,":%s ADDLINE G %s %s %lu %lu :%s",sn,i->hostmask,i->source,(unsigned long)i->set_time,(unsigned long)i->duration,i->reason); this->WriteLine(data); + if ((i % 20) == 0) + { + ServerInstance->DoOneIteration(false); + } } for (std::vector<ELine>::iterator i = elines.begin(); i != elines.end(); i++) { snprintf(data,MAXBUF,":%s ADDLINE E %s %s %lu %lu :%s",sn,i->hostmask,i->source,(unsigned long)i->set_time,(unsigned long)i->duration,i->reason); this->WriteLine(data); + if ((i % 20) == 0) + { + ServerInstance->DoOneIteration(false); + } } for (std::vector<ZLine>::iterator i = pzlines.begin(); i != pzlines.end(); i++) { snprintf(data,MAXBUF,":%s ADDLINE Z %s %s %lu %lu :%s",sn,i->ipaddr,i->source,(unsigned long)i->set_time,(unsigned long)i->duration,i->reason); this->WriteLine(data); + if ((i % 20) == 0) + { + ServerInstance->DoOneIteration(false); + } } for (std::vector<QLine>::iterator i = pqlines.begin(); i != pqlines.end(); i++) { snprintf(data,MAXBUF,":%s ADDLINE Q %s %s %lu %lu :%s",sn,i->nick,i->source,(unsigned long)i->set_time,(unsigned long)i->duration,i->reason); this->WriteLine(data); + if ((i % 20) == 0) + { + ServerInstance->DoOneIteration(false); + } } for (std::vector<GLine>::iterator i = pglines.begin(); i != pglines.end(); i++) { snprintf(data,MAXBUF,":%s ADDLINE G %s %s %lu %lu :%s",sn,i->hostmask,i->source,(unsigned long)i->set_time,(unsigned long)i->duration,i->reason); this->WriteLine(data); + if ((i % 20) == 0) + { + ServerInstance->DoOneIteration(false); + } } for (std::vector<ELine>::iterator i = pelines.begin(); i != pelines.end(); i++) { snprintf(data,MAXBUF,":%s ADDLINE E %s %s %lu %lu :%s",sn,i->hostmask,i->source,(unsigned long)i->set_time,(unsigned long)i->duration,i->reason); this->WriteLine(data); + if ((i % 20) == 0) + { + ServerInstance->DoOneIteration(false); + } } } @@ -1252,8 +1284,9 @@ class TreeSocket : public InspSocket { char data[MAXBUF]; std::deque<std::string> list; + int iterations = 0; const char* sn = Srv->GetServerName().c_str(); - for (chan_hash::iterator c = chanlist.begin(); c != chanlist.end(); c++) + for (chan_hash::iterator c = chanlist.begin(); c != chanlist.end(); c++, iterations++) { SendFJoins(Current, c->second); snprintf(data,MAXBUF,":%s FMODE %s +%s",sn,c->second->name,chanmodes(c->second,true)); @@ -1275,6 +1308,10 @@ class TreeSocket : public InspSocket { FOREACH_MOD(I_OnSyncChannelMetaData,OnSyncChannelMetaData(c->second,(Module*)TreeProtocolModule,(void*)this,list[j])); } + if ((iterations % 20) == 0) + { + ServerInstance->DoOneIteration(false); + } } } @@ -1283,7 +1320,8 @@ class TreeSocket : public InspSocket { char data[MAXBUF]; std::deque<std::string> list; - for (user_hash::iterator u = clientlist.begin(); u != clientlist.end(); u++) + int interations = 0; + for (user_hash::iterator u = clientlist.begin(); u != clientlist.end(); u++, iterations++) { if (u->second->registered == 7) { @@ -1304,6 +1342,10 @@ class TreeSocket : public InspSocket { FOREACH_MOD(I_OnSyncUserMetaData,OnSyncUserMetaData(u->second,(Module*)TreeProtocolModule,(void*)this,list[j])); } + if ((iterations % 20) == 0) + { + ServerInstance->DoOneIteration(false); + } } } } @@ -1342,6 +1384,7 @@ class TreeSocket : public InspSocket virtual bool OnDataReady() { log(DEBUG,"TreeSocket::OnDataReady"); + int iterations = 0; char* data = this->Read(); /* Check that the data read is a valid pointer and it has some content */ if (data && *data) @@ -1353,6 +1396,11 @@ class TreeSocket : public InspSocket */ while (in_buffer.find("\n") != std::string::npos) { + iterations++; + if ((iterations % 20) == 0) + { + ServerInstance->DoOneIteration(false); + } std::string ret = in_buffer.substr(0,in_buffer.find("\n")-1); in_buffer = in_buffer.substr(in_buffer.find("\n")+1,in_buffer.length()-in_buffer.find("\n")); if (ret.find("\r") != std::string::npos) |