From: Francesco Chemolli Date: Tue, 1 Sep 2015 15:54:09 +0000 (+0200) Subject: Implement periodic cleanup function X-Git-Tag: SQUID_4_0_1~21^2~47 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=0b5cd1d0e33271577c145575d5a16151a675f41e;p=thirdparty%2Fsquid.git Implement periodic cleanup function --- diff --git a/src/auth/User.h b/src/auth/User.h index 6af51cad16..e080e5ca0b 100644 --- a/src/auth/User.h +++ b/src/auth/User.h @@ -26,6 +26,7 @@ namespace Auth { class Config; +class UserNameCache; /** * \ingroup AuthAPI diff --git a/src/auth/UserNameCache.cc b/src/auth/UserNameCache.cc index ba28ae4643..892f33a9f4 100644 --- a/src/auth/UserNameCache.cc +++ b/src/auth/UserNameCache.cc @@ -7,15 +7,23 @@ */ #include "squid.h" +#include "Debug.h" +#include "event.h" #include "SquidConfig.h" #include "SquidTime.h" -#include "UserNameCache.h" - -#include +#include "auth/UserNameCache.h" namespace Auth { -User::Pointer +UserNameCache::UserNameCache(const char *name) : + cachename(name) +{ + static std::string eventName("User Cache cleanup: "); + eventName.append(name); + eventAdd(eventName.c_str(), &UserNameCache::cleanup, this, ::Config.authenticateGCInterval, 1); +} + +Auth::User::Pointer UserNameCache::lookup(const SBuf &userKey) { auto p = store_.find(userKey); @@ -37,14 +45,16 @@ UserNameCache::size() } void -UserNameCache::cleanup(void *) +UserNameCache::cleanup(void *me) { + // me is this in disguise + UserNameCache *self = static_cast(me); // cache entries with expiretime <= expirationTime are to be evicted const time_t expirationTime = current_time.tv_sec - ::Config.authenticateTTL; - const auto end = store_.end(); - for (auto i = store_.begin(); i != end; ++i) { + const auto end = self->store_.end(); + for (auto i = self->store_.begin(); i != end; ++i) { if (i->second->expiretime <= expirationTime) - store_.erase(i); + self->store_.erase(i); } } diff --git a/src/auth/UserNameCache.h b/src/auth/UserNameCache.h index 86274ca6ed..d40dda9f9b 100644 --- a/src/auth/UserNameCache.h +++ b/src/auth/UserNameCache.h @@ -10,7 +10,7 @@ #define SQUID_USERNAMECACHE_H_ #include "SBufAlgos.h" -#include "User.h" +#include "auth/User.h" #include @@ -20,25 +20,28 @@ class UserNameCache { private: /// key is Uer::userKey(), mapped value is User::Pointer - typedef std::unordered_map StoreType; + typedef std::unordered_map StoreType; public: UserNameCache() = delete; - explicit UserNameCache(const char *name) : cachename(name) {} + explicit UserNameCache(const char *name); ~UserNameCache() = default; UserNameCache(const UserNameCache& ) = delete; UserNameCache& operator=(const UserNameCache&) = delete; /// obtain pointer to user if present, or Pointer(nullptr) if not - User::Pointer lookup(const SBuf &userKey); + Auth::User::Pointer lookup(const SBuf &userKey); void reset(); size_t size(); - /// periodic cleanup function, removes timed-out entries. - void cleanup(void *); + /** periodic cleanup function, removes timed-out entries + * + * Must be static to support EVH interface. Argument is this + */ + static void cleanup(void *); private: StoreType store_;