summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/typedefs.h2
-rw-r--r--include/usermanager.h2
-rw-r--r--include/users.h4
-rw-r--r--src/usermanager.cpp2
-rw-r--r--src/users.cpp11
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();