summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/usermanager.h15
-rw-r--r--include/users.h1
-rw-r--r--src/inspircd.cpp3
-rw-r--r--src/modules/m_hostcycle.cpp4
-rw-r--r--src/usermanager.cpp26
-rw-r--r--src/users.cpp4
6 files changed, 30 insertions, 23 deletions
diff --git a/include/usermanager.h b/include/usermanager.h
index eee076802..941569e8c 100644
--- a/include/usermanager.h
+++ b/include/usermanager.h
@@ -56,6 +56,11 @@ class CoreExport UserManager : public fakederef<UserManager>
*/
LocalList local_users;
+ /** Last used already sent id, used when sending messages to neighbors to help determine whether the message has
+ * been sent to a particular user or not. See User::ForEachNeighbor() for more info.
+ */
+ already_sent_t already_sent_id;
+
public:
/** Constructor, initializes variables
*/
@@ -83,11 +88,6 @@ class CoreExport UserManager : public fakederef<UserManager>
*/
unsigned int unregistered_count;
- /**
- * Reset the already_sent IDs so we don't wrap it around and drop a message
- */
- void GarbageCollect();
-
/** Perform background user events such as PING checks
*/
void DoBackgroundUserStuff();
@@ -186,4 +186,9 @@ class CoreExport UserManager : public fakederef<UserManager>
* @param ... The format arguments
*/
void ServerNoticeAll(const char* text, ...) CUSTOM_PRINTF(2, 3);
+
+ /** Retrieves the next already sent id, guaranteed to be not equal to any user's already_sent field
+ * @return Next already_sent id
+ */
+ already_sent_t NextAlreadySentId();
};
diff --git a/include/users.h b/include/users.h
index 03540018b..fa346a329 100644
--- a/include/users.h
+++ b/include/users.h
@@ -720,7 +720,6 @@ class CoreExport LocalUser : public User, public insp::intrusive_list_node<Local
*/
unsigned int CommandFloodPenalty;
- static already_sent_t already_sent_id;
already_sent_t already_sent;
/** Check if the user matches a G or K line, and disconnect them if they do.
diff --git a/src/inspircd.cpp b/src/inspircd.cpp
index fce99f421..145d4582a 100644
--- a/src/inspircd.cpp
+++ b/src/inspircd.cpp
@@ -664,10 +664,7 @@ void InspIRCd::Run()
OLDTIME = TIME.tv_sec;
if ((TIME.tv_sec % 3600) == 0)
- {
- Users->GarbageCollect();
FOREACH_MOD(OnGarbageCollect, ());
- }
Timers.TickTimers(TIME.tv_sec);
Users->DoBackgroundUserStuff();
diff --git a/src/modules/m_hostcycle.cpp b/src/modules/m_hostcycle.cpp
index e8a0abbf1..d4def6473 100644
--- a/src/modules/m_hostcycle.cpp
+++ b/src/modules/m_hostcycle.cpp
@@ -29,8 +29,8 @@ class ModuleHostCycle : public Module
// GetFullHost() returns the original data at the time this function is called
const std::string quitline = ":" + user->GetFullHost() + " QUIT :" + quitmsg;
- already_sent_t silent_id = ++LocalUser::already_sent_id;
- already_sent_t seen_id = ++LocalUser::already_sent_id;
+ already_sent_t silent_id = ServerInstance->Users.NextAlreadySentId();
+ already_sent_t seen_id = ServerInstance->Users.NextAlreadySentId();
IncludeChanList include_chans(user->chans.begin(), user->chans.end());
std::map<User*,bool> exceptions;
diff --git a/src/usermanager.cpp b/src/usermanager.cpp
index 41061f6d1..ba6bbf36b 100644
--- a/src/usermanager.cpp
+++ b/src/usermanager.cpp
@@ -49,7 +49,8 @@ namespace
}
UserManager::UserManager()
- : unregistered_count(0)
+ : already_sent_id(0)
+ , unregistered_count(0)
{
}
@@ -278,14 +279,6 @@ void UserManager::ServerNoticeAll(const char* text, ...)
}
}
-void UserManager::GarbageCollect()
-{
- // Reset the already_sent IDs so we don't wrap it around and drop a message
- LocalUser::already_sent_id = 0;
- for (LocalList::const_iterator i = local_users.begin(); i != local_users.end(); ++i)
- (**i).already_sent = 0;
-}
-
/* this returns true when all modules are satisfied that the user should be allowed onto the irc server
* (until this returns true, a user will block in the waiting state, waiting to connect up to the
* registration timeout maximum seconds)
@@ -368,3 +361,18 @@ void UserManager::DoBackgroundUserStuff()
}
}
}
+
+already_sent_t UserManager::NextAlreadySentId()
+{
+ if (++already_sent_id == 0)
+ {
+ // Wrapped around, reset the already_sent ids of all users
+ already_sent_id = 1;
+ for (LocalList::iterator i = local_users.begin(); i != local_users.end(); ++i)
+ {
+ LocalUser* user = *i;
+ user->already_sent = 0;
+ }
+ }
+ return already_sent_id;
+}
diff --git a/src/users.cpp b/src/users.cpp
index d503844e7..93fd8d065 100644
--- a/src/users.cpp
+++ b/src/users.cpp
@@ -26,8 +26,6 @@
#include "inspircd.h"
#include "xline.h"
-already_sent_t LocalUser::already_sent_id = 0;
-
bool User::IsNoticeMaskSet(unsigned char sm)
{
if (!isalpha(sm))
@@ -873,7 +871,7 @@ void User::ForEachNeighbor(ForEachNeighborHandler& handler, bool include_self)
FOREACH_MOD(OnBuildNeighborList, (this, include_chans, exceptions));
// Get next id, guaranteed to differ from the already_sent field of all users
- const already_sent_t newid = ++LocalUser::already_sent_id;
+ const already_sent_t newid = ServerInstance->Users.NextAlreadySentId();
// Handle exceptions first
for (std::map<User*, bool>::const_iterator i = exceptions.begin(); i != exceptions.end(); ++i)