summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorattilamolnar <attilamolnar@hush.com>2013-05-16 20:51:12 +0200
committerattilamolnar <attilamolnar@hush.com>2013-05-16 20:51:12 +0200
commitbb962f92ace6eb23c66c5fccee01f825c22363c3 (patch)
tree9a9fd3ca343fb685477c2c45668211236bb7ed1a
parent0a8b0d317ed4adc43185c1b791bcf752115dc58e (diff)
Workaround for std::list::size() having linear complexity on some implementations
-rw-r--r--include/usermanager.h6
-rw-r--r--src/usermanager.cpp3
-rw-r--r--src/users.cpp3
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);