diff options
author | attilamolnar <attilamolnar@hush.com> | 2013-05-16 20:51:12 +0200 |
---|---|---|
committer | attilamolnar <attilamolnar@hush.com> | 2013-05-16 20:51:12 +0200 |
commit | bb962f92ace6eb23c66c5fccee01f825c22363c3 (patch) | |
tree | 9a9fd3ca343fb685477c2c45668211236bb7ed1a | |
parent | 0a8b0d317ed4adc43185c1b791bcf752115dc58e (diff) |
Workaround for std::list::size() having linear complexity on some implementations
-rw-r--r-- | include/usermanager.h | 6 | ||||
-rw-r--r-- | src/usermanager.cpp | 3 | ||||
-rw-r--r-- | src/users.cpp | 3 |
3 files changed, 10 insertions, 2 deletions
diff --git a/include/usermanager.h b/include/usermanager.h index 3d7fe88fb..743db508a 100644 --- a/include/usermanager.h +++ b/include/usermanager.h @@ -63,7 +63,11 @@ class CoreExport UserManager /** Number of unregistered users online right now. * (Unregistered means before USER/NICK/dns) */ - int unregistered_count; + 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. diff --git a/src/usermanager.cpp b/src/usermanager.cpp index e3ddfc9f2..670add777 100644 --- a/src/usermanager.cpp +++ b/src/usermanager.cpp @@ -74,6 +74,7 @@ void UserManager::AddUser(int socket, ListenSocket* via, irc::sockets::sockaddrs ServerInstance->Users->AddGlobalClone(New); New->localuseriter = this->local_users.insert(local_users.end(), New); + local_count++; if ((this->local_users.size() > ServerInstance->Config->SoftLimit) || (this->local_users.size() >= (unsigned int)ServerInstance->SE->GetMaxFds())) { @@ -332,7 +333,7 @@ unsigned int UserManager::UnregisteredUserCount() unsigned int UserManager::LocalUserCount() { /* Doesnt count unregistered clients */ - return (this->local_users.size() - this->UnregisteredUserCount()); + return (this->local_count - this->UnregisteredUserCount()); } void UserManager::ServerNoticeAll(const char* text, ...) diff --git a/src/users.cpp b/src/users.cpp index f48e3642f..2305ba8ce 100644 --- a/src/users.cpp +++ b/src/users.cpp @@ -545,7 +545,10 @@ CullResult LocalUser::cull() // 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", DEFAULT, "ERROR: LocalUserIter does not point to a valid entry for " + this->nick); |