diff options
-rw-r--r-- | include/typedefs.h | 2 | ||||
-rw-r--r-- | include/usermanager.h | 2 | ||||
-rw-r--r-- | include/users.h | 4 | ||||
-rw-r--r-- | src/usermanager.cpp | 2 | ||||
-rw-r--r-- | src/users.cpp | 11 |
5 files changed, 13 insertions, 8 deletions
diff --git a/include/typedefs.h b/include/typedefs.h index 250bec5c9..06f704120 100644 --- a/include/typedefs.h +++ b/include/typedefs.h @@ -66,7 +66,7 @@ struct ResourceRecord; /** A list holding local users, this is the type of UserManager::local_users */ -typedef std::vector<LocalUser*> LocalUserList; +typedef std::list<LocalUser*> LocalUserList; /** A list of failed port bindings, used for informational purposes on startup */ typedef std::vector<std::pair<std::string, std::string> > FailedPortList; diff --git a/include/usermanager.h b/include/usermanager.h index be6c6b6bb..3d7fe88fb 100644 --- a/include/usermanager.h +++ b/include/usermanager.h @@ -52,7 +52,7 @@ class CoreExport UserManager */ user_hash* uuidlist; - /** Local client list, a vector containing only local clients + /** Local client list, a list containing only local clients */ LocalUserList local_users; diff --git a/include/users.h b/include/users.h index 9b1339611..1328bf0cb 100644 --- a/include/users.h +++ b/include/users.h @@ -747,6 +747,10 @@ class CoreExport LocalUser : public User, public InviteBase UserIOHandler eh; + /** Position in UserManager::local_users + */ + LocalUserList::iterator localuseriter; + /** Stats counter for bytes inbound */ int bytes_in; diff --git a/src/usermanager.cpp b/src/usermanager.cpp index 279b1d3ec..bef7ccbcc 100644 --- a/src/usermanager.cpp +++ b/src/usermanager.cpp @@ -73,7 +73,7 @@ void UserManager::AddUser(int socket, ListenSocket* via, irc::sockets::sockaddrs ServerInstance->Users->AddLocalClone(New); ServerInstance->Users->AddGlobalClone(New); - this->local_users.push_back(New); + New->localuseriter = this->local_users.insert(local_users.end(), 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 7cfbdbc0c..e55c7e099 100644 --- a/src/users.cpp +++ b/src/users.cpp @@ -219,6 +219,7 @@ User::User(const std::string &uid, const std::string& sid, int type) LocalUser::LocalUser(int myfd, irc::sockets::sockaddrs* client, irc::sockets::sockaddrs* servaddr) : User(ServerInstance->GetUID(), ServerInstance->Config->ServerName, 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) { @@ -539,11 +540,11 @@ CullResult User::cull() CullResult LocalUser::cull() { - LocalUserList::iterator x = find(ServerInstance->Users->local_users.begin(),ServerInstance->Users->local_users.end(),this); - if (x != ServerInstance->Users->local_users.end()) - ServerInstance->Users->local_users.erase(x); - else - ServerInstance->Logs->Log("USERS", DEBUG, "Failed to remove user from vector"); + // 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_users.erase(localuseriter); ClearInvites(); eh.cull(); |