+ 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
+ * empty buckets to be weeded out of the hash. We dont do this on a timer, as its
+ * very expensive, so instead we do it when the user types /REHASH and expects a
+ * short delay anyway.
+ */
+void InspIRCd::RehashUsersAndChans()
+{
+ user_hash* old_users = this->clientlist;
+ chan_hash* old_chans = this->chanlist;
+
+ this->clientlist = new user_hash();
+ this->chanlist = new chan_hash();
+
+ for (user_hash::const_iterator n = old_users->begin(); n != old_users->end(); n++)
+ this->clientlist->insert(*n);
+
+ delete old_users;
+
+ for (chan_hash::const_iterator n = old_chans->begin(); n != old_chans->end(); n++)
+ this->chanlist->insert(*n);
+
+ delete old_chans;
+}
+
+void InspIRCd::CloseLog()
+{
+ this->Logger->Close();