]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/bancache.cpp
Improve UserManager::QuitUser() and related code
[user/henk/code/inspircd.git] / src / bancache.cpp
index 244ffd758206f1965674e7ebcc807c700d7874e2..4bb2fa82c4c460c27f201edbc2c7c9610dd3363d 100644 (file)
@@ -18,8 +18,6 @@
  */
 
 
-/* $Core */
-
 #include "inspircd.h"
 #include "bancache.h"
 
@@ -39,29 +37,36 @@ BanCacheHit *BanCacheManager::GetHit(const std::string &ip)
 
        if (i == this->BanHash->end())
                return NULL; // free and safe
-       else
-       {
-               if (ServerInstance->Time() > i->second->Expiry)
-               {
-                       ServerInstance->Logs->Log("BANCACHE", DEBUG, "Hit on " + ip + " is out of date, removing!");
-                       delete i->second;
-                       BanHash->erase(i);
-                       return NULL; // out of date
-               }
 
-               return i->second; // hit.
-       }
+       if (RemoveIfExpired(i))
+               return NULL; // expired
+
+       return i->second; // hit.
+}
+
+bool BanCacheManager::RemoveIfExpired(BanCacheHash::iterator& it)
+{
+       if (ServerInstance->Time() < it->second->Expiry)
+               return false;
+
+       ServerInstance->Logs->Log("BANCACHE", LOG_DEBUG, "Hit on " + it->first + " is out of date, removing!");
+       delete it->second;
+       it = BanHash->erase(it);
+       return true;
 }
 
 void BanCacheManager::RemoveEntries(const std::string& type, bool positive)
 {
        if (positive)
-               ServerInstance->Logs->Log("BANCACHE", DEBUG, "BanCacheManager::RemoveEntries(): Removing positive hits for " + type);
+               ServerInstance->Logs->Log("BANCACHE", LOG_DEBUG, "BanCacheManager::RemoveEntries(): Removing positive hits for " + type);
        else
-               ServerInstance->Logs->Log("BANCACHE", DEBUG, "BanCacheManager::RemoveEntries(): Removing all negative hits");
+               ServerInstance->Logs->Log("BANCACHE", LOG_DEBUG, "BanCacheManager::RemoveEntries(): Removing all negative hits");
 
        for (BanCacheHash::iterator i = BanHash->begin(); i != BanHash->end(); )
        {
+               if (RemoveIfExpired(i))
+                       continue; // updates the iterator if expired
+
                BanCacheHit* b = i->second;
                bool remove = false;
 
@@ -79,7 +84,7 @@ void BanCacheManager::RemoveEntries(const std::string& type, bool positive)
                if (remove)
                {
                        /* we need to remove this one. */
-                       ServerInstance->Logs->Log("BANCACHE", DEBUG, "BanCacheManager::RemoveEntries(): Removing a hit on " + i->first);
+                       ServerInstance->Logs->Log("BANCACHE", LOG_DEBUG, "BanCacheManager::RemoveEntries(): Removing a hit on " + i->first);
                        delete b;
                        i = BanHash->erase(i);
                }
@@ -88,40 +93,6 @@ void BanCacheManager::RemoveEntries(const std::string& type, bool positive)
        }
 }
 
-void BanCacheManager::RehashCache()
-{
-       BanCacheHash* NewHash = new BanCacheHash();
-
-       BanCacheHash::iterator safei;
-       for (BanCacheHash::iterator n = BanHash->begin(); n != BanHash->end(); )
-       {
-               safei = n;
-               safei++;
-
-               /* Safe to delete items here through iterator 'n' */
-               BanCacheHit *b = n->second;
-
-               if (ServerInstance->Time() > b->Expiry)
-               {
-                       /* we need to remove this one. */
-                       delete b;
-                       BanHash->erase(n); // WORD TO THE WISE: don't use RemoveHit here, because we MUST remove the iterator in a safe way.
-               }
-               else
-               {
-                       /* Actually inserts a std::pair */
-                       NewHash->insert(*n);
-               }
-
-               /* End of safe section */
-
-               n = safei;
-       }
-
-       delete BanHash;
-       BanHash = NewHash;
-}
-
 BanCacheManager::~BanCacheManager()
 {
        for (BanCacheHash::iterator n = BanHash->begin(); n != BanHash->end(); ++n)