mirror of
https://github.com/inspircd/inspircd.git
synced 2025-03-10 02:59:01 -04:00
Cache channel max bans value to save an O(n) loop of match() on every ban (etc) add
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@6267 e03df62e-2008-0410-955e-edbf42e46eb7
This commit is contained in:
parent
7a9d31a463
commit
be70931a50
@ -124,6 +124,10 @@ class chanrec : public Extensible
|
||||
|
||||
prefixlist prefixes;
|
||||
|
||||
/** Maximum number of bans (cached)
|
||||
*/
|
||||
int maxbans;
|
||||
|
||||
public:
|
||||
/** The channels name.
|
||||
*/
|
||||
@ -510,6 +514,10 @@ class chanrec : public Extensible
|
||||
*/
|
||||
bool IsBanned(userrec* user);
|
||||
|
||||
/** Clears the cached max bans value
|
||||
*/
|
||||
void ResetMaxBans();
|
||||
|
||||
/** Destructor for chanrec
|
||||
*/
|
||||
virtual ~chanrec() { /* stub */ }
|
||||
|
@ -1169,6 +1169,11 @@ class InspIRCd : public classbase
|
||||
*/
|
||||
void RehashUsersAndChans();
|
||||
|
||||
/** Resets the cached max bans value on all channels.
|
||||
* Called by rehash.
|
||||
*/
|
||||
void ResetMaxBans();
|
||||
|
||||
/** Begin execution of the server.
|
||||
* NOTE: this function NEVER returns. Internally,
|
||||
* after performing some initialisation routines,
|
||||
|
@ -22,7 +22,7 @@
|
||||
chanrec::chanrec(InspIRCd* Instance) : ServerInstance(Instance)
|
||||
{
|
||||
*name = *topic = *setby = *key = 0;
|
||||
created = topicset = limit = 0;
|
||||
maxbans = created = topicset = limit = 0;
|
||||
memset(&modes,0,64);
|
||||
age = ServerInstance->Time(true);
|
||||
}
|
||||
@ -870,16 +870,29 @@ void chanrec::UserList(userrec *user)
|
||||
|
||||
long chanrec::GetMaxBans()
|
||||
{
|
||||
/* Return the cached value if there is one */
|
||||
if (this->maxbans)
|
||||
return this->maxbans;
|
||||
|
||||
/* If there isnt one, we have to do some O(n) hax to find it the first time. (ick) */
|
||||
for (std::map<std::string,int>::iterator n = ServerInstance->Config->maxbans.begin(); n != ServerInstance->Config->maxbans.end(); n++)
|
||||
{
|
||||
if (match(this->name,n->first.c_str()))
|
||||
{
|
||||
this->maxbans = n->second;
|
||||
return n->second;
|
||||
}
|
||||
}
|
||||
return 64;
|
||||
|
||||
/* Screw it, just return the default of 64 */
|
||||
this->maxbans = 64;
|
||||
return this->maxbans;
|
||||
}
|
||||
|
||||
void chanrec::ResetMaxBans()
|
||||
{
|
||||
this->maxbans = 0;
|
||||
}
|
||||
|
||||
/* returns the status character for a given user on a channel, e.g. @ for op,
|
||||
* % for halfop etc. If the user has several modes set, the highest mode
|
||||
|
@ -41,6 +41,7 @@ CmdResult cmd_rehash::Handle (const char** parameters, int pcnt, userrec *user)
|
||||
FOREACH_MOD(I_OnGarbageCollect, OnGarbageCollect());
|
||||
ServerInstance->Config->Read(false,user);
|
||||
ServerInstance->Res->Rehash();
|
||||
ServerInstance->ResetMaxBans();
|
||||
}
|
||||
if (old_disabled != ServerInstance->Config->DisabledCommands)
|
||||
InitializeDisabledCommands(ServerInstance->Config->DisabledCommands, ServerInstance);
|
||||
|
@ -148,10 +148,18 @@ void InspIRCd::Rehash(int status)
|
||||
SI->RehashUsersAndChans();
|
||||
FOREACH_MOD_I(SI, I_OnGarbageCollect, OnGarbageCollect());
|
||||
SI->Config->Read(false,NULL);
|
||||
SI->ResetMaxBans();
|
||||
SI->Res->Rehash();
|
||||
FOREACH_MOD_I(SI,I_OnRehash,OnRehash(NULL,""));
|
||||
}
|
||||
|
||||
void InspIRCd::ResetMaxBans()
|
||||
{
|
||||
for (chan_hash::const_iterator i = chanlist->begin(); i != chanlist->end(); i++)
|
||||
i->second->ResetMaxBans();
|
||||
}
|
||||
|
||||
|
||||
/** Because hash_map doesnt free its buckets when we delete items (this is a 'feature')
|
||||
* we must occasionally rehash the hash (yes really).
|
||||
* We do this by copying the entries from the old hash to a new hash, causing all
|
||||
|
@ -348,6 +348,7 @@ void InspIRCd::RehashServer()
|
||||
this->WriteOpers("*** Rehashing config file");
|
||||
this->RehashUsersAndChans();
|
||||
this->Config->Read(false,NULL);
|
||||
this->ResetMaxBans();
|
||||
this->Res->Rehash();
|
||||
}
|
||||
|
||||
|
@ -5158,6 +5158,7 @@ class ModuleSpanningTree : public Module
|
||||
}
|
||||
}
|
||||
Utils->ReadConfiguration(false);
|
||||
InitializeDisabledCommands(ServerInstance->Config->DisabledCommands, ServerInstance);
|
||||
}
|
||||
|
||||
// note: the protocol does not allow direct umode +o except
|
||||
|
Loading…
x
Reference in New Issue
Block a user