]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
de-duplicate event scheduling
authorAmos Jeffries <squid3@treenet.co.nz>
Tue, 8 Sep 2015 15:45:28 +0000 (08:45 -0700)
committerAmos Jeffries <squid3@treenet.co.nz>
Tue, 8 Sep 2015 15:45:28 +0000 (08:45 -0700)
src/auth/CredentialsCache.cc
src/auth/CredentialsCache.h

index fcc60ba76fe19e65c895cf9af1445f784b38604c..685f5e102cf62a5e52327717d464f1831f3427cf 100644 (file)
@@ -21,13 +21,12 @@ namespace Auth {
 CBDATA_CLASS_INIT(CredentialsCache);
 
 CredentialsCache::CredentialsCache(const char *name) :
+    gcScheduled_(false),
     cachename(name),
     cacheCleanupEventName("User cache cleanup: ")
 {
     debugs(29, 5, "initializing " << name << " username cache");
     cacheCleanupEventName.append(name);
-    eventAdd(cacheCleanupEventName.c_str(), &CredentialsCache::Cleanup,
-             this, ::Config.authenticateGCInterval, 1);
     RegisterRunner(this);
 }
 
@@ -67,8 +66,7 @@ CredentialsCache::cleanup()
             ++i;
         }
     }
-    eventAdd(cacheCleanupEventName.c_str(), &CredentialsCache::Cleanup,
-             this, ::Config.authenticateGCInterval, 1);
+    scheduleCleanup();
 }
 
 void
@@ -76,6 +74,7 @@ CredentialsCache::insert(Auth::User::Pointer anAuth_user)
 {
     debugs(29, 6, "adding " << anAuth_user->userKey());
     store_[anAuth_user->userKey()] = anAuth_user;
+    scheduleCleanup();
 }
 
 // generates the list of cached usernames in a format that is convenient
@@ -95,6 +94,16 @@ CredentialsCache::sortedUsersList() const
     return rv;
 }
 
+void
+CredentialsCache::scheduleCleanup()
+{
+    if (!gcScheduled_ && store_.size()) {
+        gcScheduled_ = true;
+        eventAdd(cacheCleanupEventName.c_str(), &CredentialsCache::Cleanup,
+                 this, ::Config.authenticateGCInterval, 1);
+    }
+}
+
 void
 CredentialsCache::endingShutdown()
 {
index a9797475e20a0164e80eb3ef1ea92663592fdf64..793c202c755f66dacd63479e59bba79834cc28ef 100644 (file)
@@ -67,6 +67,11 @@ public:
     virtual void syncConfig() override;
 
 private:
+    void scheduleCleanup();
+
+    /// whether a GC event has been scheduled
+    bool gcScheduled_;
+
     StoreType store_;
 
     // for logs, events etc.