From: Attila Molnar Date: Fri, 24 Jan 2014 12:08:13 +0000 (+0100) Subject: Convert LocalUserList to an intrusively linked list X-Git-Url: https://git.netwichtig.de/gitweb/?a=commitdiff_plain;h=f1f8173bb5ca5f5ce01ad92d0ccd309f232fc138;p=user%2Fhenk%2Fcode%2Finspircd.git Convert LocalUserList to an intrusively linked list --- diff --git a/include/typedefs.h b/include/typedefs.h index 050707e73..067768db4 100644 --- a/include/typedefs.h +++ b/include/typedefs.h @@ -57,7 +57,7 @@ typedef TR1NS::unordered_map LocalUserList; +typedef intrusive_list LocalUserList; /** A list of failed port bindings, used for informational purposes on startup */ typedef std::vector > FailedPortList; diff --git a/include/usermanager.h b/include/usermanager.h index a807cd447..e287d74d0 100644 --- a/include/usermanager.h +++ b/include/usermanager.h @@ -63,10 +63,6 @@ class CoreExport UserManager */ unsigned int unregistered_count; - /** Number of elements in local_users - */ - unsigned int local_count; - /** Map of global ip addresses for clone counting * XXX - this should be private, but m_clones depends on it currently. */ @@ -159,7 +155,7 @@ class CoreExport UserManager /** Return a count of local registered users * @return The number of registered local users */ - unsigned int LocalUserCount() const { return (this->local_count - this->UnregisteredUserCount()); } + unsigned int LocalUserCount() const { return (this->local_users.size() - this->UnregisteredUserCount()); } /** Send a server notice to all local users * @param text The text format string to send diff --git a/include/users.h b/include/users.h index f8bfb5a6e..db2d53878 100644 --- a/include/users.h +++ b/include/users.h @@ -655,7 +655,7 @@ class CoreExport UserIOHandler : public StreamSocket typedef unsigned int already_sent_t; -class CoreExport LocalUser : public User, public InviteBase +class CoreExport LocalUser : public User, public InviteBase, public intrusive_list_node { public: LocalUser(int fd, irc::sockets::sockaddrs* client, irc::sockets::sockaddrs* server); @@ -663,10 +663,6 @@ class CoreExport LocalUser : public User, public InviteBase UserIOHandler eh; - /** Position in UserManager::local_users - */ - LocalUserList::iterator localuseriter; - /** Stats counter for bytes inbound */ unsigned int bytes_in; diff --git a/src/inspircd.cpp b/src/inspircd.cpp index fb33f1937..12962d92d 100644 --- a/src/inspircd.cpp +++ b/src/inspircd.cpp @@ -107,12 +107,9 @@ void InspIRCd::Cleanup() ports.clear(); /* Close all client sockets, or the new process inherits them */ - LocalUserList::reverse_iterator i = Users->local_users.rbegin(); - while (i != this->Users->local_users.rend()) - { - User* u = *i++; - Users->QuitUser(u, "Server shutdown"); - } + LocalUserList& list = Users->local_users; + for (LocalUserList::iterator i = list.begin(); i != list.end(); ++i) + Users->QuitUser(*i, "Server shutdown"); GlobalCulls.Apply(); Modules->UnloadAll(); diff --git a/src/usermanager.cpp b/src/usermanager.cpp index 29d1f7370..13646f225 100644 --- a/src/usermanager.cpp +++ b/src/usermanager.cpp @@ -28,7 +28,7 @@ UserManager::UserManager() : clientlist(new user_hash) , uuidlist(new user_hash) - , unregistered_count(0), local_count(0) + , unregistered_count(0) { } @@ -81,8 +81,7 @@ void UserManager::AddUser(int socket, ListenSocket* via, irc::sockets::sockaddrs ServerInstance->Users->AddLocalClone(New); ServerInstance->Users->AddGlobalClone(New); - New->localuseriter = this->local_users.insert(local_users.end(), New); - local_count++; + this->local_users.push_front(New); if ((this->local_users.size() > ServerInstance->Config->SoftLimit) || (this->local_users.size() >= (unsigned int)ServerInstance->SE->GetMaxFds())) { diff --git a/src/users.cpp b/src/users.cpp index df42d2a9c..6ec46883f 100644 --- a/src/users.cpp +++ b/src/users.cpp @@ -86,7 +86,6 @@ User::User(const std::string& uid, Server* srv, int type) LocalUser::LocalUser(int myfd, irc::sockets::sockaddrs* client, irc::sockets::sockaddrs* servaddr) : User(ServerInstance->UIDGen.GetUID(), ServerInstance->FakeClient->server, USERTYPE_LOCAL), eh(this), - localuseriter(ServerInstance->Users->local_users.end()), bytes_in(0), bytes_out(0), cmds_in(0), cmds_out(0), nping(0), CommandFloodPenalty(0), already_sent(0) { @@ -337,17 +336,7 @@ CullResult User::cull() CullResult LocalUser::cull() { - // The iterator is initialized to local_users.end() in the constructor. It is - // overwritten in UserManager::AddUser() with the real iterator so this check - // is only a precaution currently. - if (localuseriter != ServerInstance->Users->local_users.end()) - { - ServerInstance->Users->local_count--; - ServerInstance->Users->local_users.erase(localuseriter); - } - else - ServerInstance->Logs->Log("USERS", LOG_DEFAULT, "ERROR: LocalUserIter does not point to a valid entry for " + this->nick); - + ServerInstance->Users->local_users.erase(this); ClearInvites(); eh.cull(); return User::cull(); diff --git a/src/xline.cpp b/src/xline.cpp index 63a64d6b9..d2fd9a5be 100644 --- a/src/xline.cpp +++ b/src/xline.cpp @@ -430,10 +430,10 @@ void XLineManager::ExpireLine(ContainerIter container, LookupIter item) // applies lines, removing clients and changing nicks etc as applicable void XLineManager::ApplyLines() { - LocalUserList::reverse_iterator u2 = ServerInstance->Users->local_users.rbegin(); - while (u2 != ServerInstance->Users->local_users.rend()) + LocalUserList& list = ServerInstance->Users->local_users; + for (LocalUserList::iterator j = list.begin(); j != list.end(); ++j) { - LocalUser* u = *u2++; + LocalUser* u = *j; // Don't ban people who are exempt. if (u->exempt)