]> git.netwichtig.de Git - user/henk/code/inspircd.git/commitdiff
Remove an O(log n) in favour of an O(1) operation, and tidy up culllist some more
authorw00t <w00t@e03df62e-2008-0410-955e-edbf42e46eb7>
Wed, 16 Jan 2008 16:19:57 +0000 (16:19 +0000)
committerw00t <w00t@e03df62e-2008-0410-955e-edbf42e46eb7>
Wed, 16 Jan 2008 16:19:57 +0000 (16:19 +0000)
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@8717 e03df62e-2008-0410-955e-edbf42e46eb7

include/cull_list.h
include/users.h
src/commands/cmd_kill.cpp
src/cull_list.cpp
src/users.cpp

index 25c4b48a50ed6cc3a0ad815b3ead8dc73f336c70..ff22880b4e499c9597529abb36cb679d84347b0e 100644 (file)
 #ifndef __CULLLIST_H__
 #define __CULLLIST_H__
 
-// include the common header files
-
-#include <string>
-#include <deque>
-#include <vector>
-
-class InspIRCd;
-
-/** The CullItem class holds a user and their quitmessage,
- * and is used internally by the CullList class to compile
- * a list of users which are to be culled when a long
- * operation (such as a netsplit) has completed.
- */
-class CoreExport CullItem : public classbase
-{
- private:
-       /** Holds a pointer to the user,
-        * must be valid and can be a local or remote user.
-        */
-       User* user;
-       /** Holds the quit reason to use for this user.
-        */
-       std::string reason;
-       /** Holds the quit reason opers see, if different from users
-        */
-       std::string oper_reason;
-       /** Silent items dont generate an snotice.
-        */
-       bool silent;
- public:
-       /** Constrcutor.
-       * Initializes the CullItem with a user pointer
-       * and their quit reason
-       * @param u The user to add
-       * @param r The quit reason of the added user
-       * @param ro The quit reason to show to opers only
-       */
-       CullItem(User* u, std::string &r, const char* ro = "");
-       /** Constrcutor.
-        * Initializes the CullItem with a user pointer
-        * and their quit reason
-        * @param u The user to add
-        * @param r The quit reason of the added user
-        * @param ro The quit reason to show to opers only
-        */
-       CullItem(User* u, const char* r, const char* ro = "");
-
-       /** Make the quit silent a module is dealing with
-        * displaying this users quit, so we shouldn't
-        * send anything out.
-        */
-       void MakeSilent();
-
-       /** Returns true if the quit for this user has been set
-        * to silent.
-        */
-       bool IsSilent();
-
-       /** Destructor
-        */
-       ~CullItem();
-
-       /** Returns a pointer to the user
-       */
-       User* GetUser();
-       /** Returns the user's quit reason
-       */
-       std::string& GetReason();
-       /** Returns oper reason
-        */
-       std::string& GetOperReason();
-};
-
-/** The CullList class can be used by modules, and is used
- * by the core, to compile large lists of users in preperation
+/** The CullList class is used by the core to create lists of users
+ * prior to actually quitting (and deleting the objects) all at once.
  * to quitting them all at once. This is faster than quitting
  * them within the loop, as the loops become tighter with
  * little or no comparisons within them. The CullList class
@@ -99,6 +26,8 @@ class CoreExport CullItem : public classbase
  * or remote users, but it may only hold each user once. If
  * you attempt to add the same user twice, then the second
  * attempt will be ignored.
+ *
+ * NOTE: Don't use this outside core, use the QuitUser method like everyone else!
  */
 class CoreExport CullList : public classbase
 {
@@ -107,10 +36,6 @@ class CoreExport CullList : public classbase
         */
        InspIRCd* ServerInstance;
 
-       /** Holds a list of users already added for quick lookup
-        */
-       std::map<User*, User*> exempt;
-
        /** Holds a list of users being quit.
         * See the information for CullItem for
         * more information.
@@ -119,8 +44,6 @@ class CoreExport CullList : public classbase
 
  public:
        /** Constructor.
-        * Clears the CullList::list and CullList::exempt
-        * items.
         * @param Instance Creator of this CullList object
         */
        CullList(InspIRCd* Instance);
index a452ec014bc2c465f5affb71af4f9aa7252f8375..d9330d42720437020225db9b0648fd5b417b0793 100644 (file)
@@ -636,9 +636,8 @@ class CoreExport User : public connection
         * are dropped into the bit-bucket.
         * This value is set by QuitUser, and is not needed seperately from that call.
         * Please note that setting this value alone will NOT cause the user to quit.
-        * This means it can be used seperately, for example by shun modules etc.
         */
-       bool muted;
+       bool quitting;
 
        /** IPV4 or IPV6 ip address. Use SetSockAddr to set this and GetProtocolFamily/
         * GetIPString/GetPort to obtain its values.
index 675532a3ce259b671adec72529bc6a164634c149..6a1e64d7fe8e02b3063a0900d781acbf02c8005d 100644 (file)
@@ -90,7 +90,7 @@ CmdResult CommandKill::Handle (const char** parameters, int pcnt, User *user)
                        /* Bug #419, make sure this message can only occur once even in the case of multiple KILL messages crossing the network, and change to show
                         * hidekillsserver as source if possible
                         */
-                       if (!u->muted)
+                       if (!u->quitting)
                        {
                                u->Write(":%s KILL %s :%s!%s!%s (%s)", *ServerInstance->Config->HideKillsServer ? ServerInstance->Config->HideKillsServer : user->GetFullHost(),
                                                u->nick,
index 2b769e893247402d4f0120e3dff4ea67f6aa6de4..365cca2319d9c2cdfb1c8e65b4a7158440955515 100644 (file)
 CullList::CullList(InspIRCd* Instance) : ServerInstance(Instance)
 {
        list.clear();
-       exempt.clear();
 }
 
 void CullList::AddItem(User* user)
 {
-       if (exempt.find(user) == exempt.end())
-       {
-               list.push_back(user);
-               exempt[user] = user;
-       }
+       if (user->quitting)
+               return;
+
+       list.push_back(user);
 }
 
 void CullList::MakeSilent(User* user)
@@ -48,7 +46,6 @@ int CullList::Apply()
 
                User *u = (*a);
                user_hash::iterator iter = ServerInstance->clientlist->find(u->nick);
-               std::map<User*, User*>::iterator exemptiter = exempt.find(u);
                const char* preset_reason = u->GetOperQuit();
                std::string reason = u->operquitmsg;
                std::string oper_reason = *preset_reason ? preset_reason : u->operquitmsg;
@@ -131,7 +128,6 @@ int CullList::Apply()
 
                delete u;
                list.erase(list.begin());
-               exempt.erase(exemptiter);
        }
 
        return n;
index 538f8d33be27c5f2bf8099e941eb2b4476793199..5f37d08bbbd31c1cae9fdcff611d1bab008f3564 100644 (file)
@@ -181,7 +181,7 @@ User::User(InspIRCd* Instance, const std::string &uid) : ServerInstance(Instance
        Penalty = 0;
        lines_in = lastping = signon = idle_lastmsg = nping = registered = 0;
        ChannelCount = timeout = bytes_in = bytes_out = cmds_in = cmds_out = 0;
-       OverPenalty = ExemptFromPenalty = muted = exempt = haspassed = dns_done = false;
+       OverPenalty = ExemptFromPenalty = quitting = exempt = haspassed = dns_done = false;
        fd = -1;
        recvq.clear();
        sendq.clear();
@@ -708,7 +708,7 @@ void User::QuitUser(InspIRCd* Instance, User *user, const std::string &quitreaso
 {
        Instance->Log(DEBUG,"QuitUser: %s '%s'", user->nick, quitreason.c_str());
        user->Write("ERROR :Closing link (%s@%s) [%s]", user->ident, user->host, *operreason ? operreason : quitreason.c_str());
-       user->muted = true;
+       user->quitting = true;
        user->quietquit = false;
        user->quitmsg = quitreason;
        user->operquitmsg = operreason;
@@ -1700,7 +1700,7 @@ void User::ShowRULES()
 
 void User::HandleEvent(EventType et, int errornum)
 {
-       if (this->muted) // drop everything, user is due to be quit
+       if (this->quitting) // drop everything, user is due to be quit
                return;
 
        /* WARNING: May delete this user! */