diff options
author | Attila Molnar <attilamolnar@hush.com> | 2014-07-09 15:14:30 +0200 |
---|---|---|
committer | Attila Molnar <attilamolnar@hush.com> | 2014-07-09 15:14:30 +0200 |
commit | eef472fb62c299d4900baf0339e0eaf08648dcf1 (patch) | |
tree | 0518ec5511f6fadbe50098e62560bb585819d2e2 | |
parent | 18d9adff0fd2ea811dbbf17814a4ba5e36ed2da4 (diff) |
core_whowas Change the FIFO to be an intrusive list
-rw-r--r-- | include/commands/cmd_whowas.h | 12 | ||||
-rw-r--r-- | src/coremods/core_whowas.cpp | 23 |
2 files changed, 14 insertions, 21 deletions
diff --git a/include/commands/cmd_whowas.h b/include/commands/cmd_whowas.h index 5c2bb62ee..021e9e3b7 100644 --- a/include/commands/cmd_whowas.h +++ b/include/commands/cmd_whowas.h @@ -34,7 +34,7 @@ namespace WhoWas { /** Everything known about one nick */ - struct Nick + struct Nick : public intrusive_list_node<Nick> { /** Container where each element has information about one occurrence of this nick */ @@ -56,16 +56,16 @@ namespace WhoWas */ ~Nick(); }; + + /** Order in which the users were added into the map, used to remove oldest nick + */ + typedef intrusive_list_tail<Nick> FIFO; } /** Sets of users in the whowas system */ typedef std::map<irc::string, WhoWas::Nick*> whowas_users; -/** Sets of time and users in whowas list - */ -typedef std::deque<std::pair<time_t,irc::string> > whowas_users_fifo; - /** Handle /WHOWAS. These command handlers can be reloaded by the core, * and handle basic RFC1459 commands. Commands within modules work * the same way, however, they can be fully unloaded, where these @@ -80,7 +80,7 @@ class CommandWhowas : public Command /** List of nicknames in the order they were inserted into the map */ - whowas_users_fifo whowas_fifo; + WhoWas::FIFO whowas_fifo; public: /** Max number of WhoWas entries per user. diff --git a/src/coremods/core_whowas.cpp b/src/coremods/core_whowas.cpp index 53b25eb7c..a27eb4341 100644 --- a/src/coremods/core_whowas.cpp +++ b/src/coremods/core_whowas.cpp @@ -109,19 +109,15 @@ void CommandWhowas::AddToWhoWas(User* user) ret.first->second = nick; // Add this nick to the fifo too - whowas_fifo.push_back(std::make_pair(ServerInstance->Time(), ret.first->first)); + whowas_fifo.push_back(nick); if (whowas.size() > this->MaxGroups) { // Too many nicks, remove the nick which was inserted the longest time ago from both the map and the fifo - whowas_users::iterator it = whowas.find(whowas_fifo.front().second); - if (it != whowas.end()) - { - WhoWas::Nick* set = it->second; - delete set; - whowas.erase(it); - } + nick = whowas_fifo.front(); whowas_fifo.pop_front(); + whowas.erase(nick->nick); + delete nick; } } else @@ -147,22 +143,19 @@ void CommandWhowas::Prune() /* first cut the list to new size (maxgroups) and also prune entries that are timed out. */ while (!whowas_fifo.empty()) { - if ((whowas_fifo.size() > this->MaxGroups) || (whowas_fifo.front().first < min)) + WhoWas::Nick* nick = whowas_fifo.front(); + if ((whowas_fifo.size() > this->MaxGroups) || (nick->addtime < min)) { - whowas_users::iterator iter = whowas.find(whowas_fifo.front().second); - /* hopefully redundant integrity check, but added while debugging r6216 */ - if (iter == whowas.end()) + if (!whowas.erase(nick->nick)) { /* this should never happen, if it does maps are corrupt */ ServerInstance->Logs->Log("WHOWAS", LOG_DEFAULT, "BUG: Whowas maps got corrupted! (1)"); return; } - WhoWas::Nick* nick = iter->second; - delete nick; - whowas.erase(iter); whowas_fifo.pop_front(); + delete nick; } else break; |