Răsfoiți Sursa

Optimize clear_chanlist_member by using the hash

Bryan Drewery 7 ani în urmă
părinte
comite
6bd0627106
3 a modificat fișierele cu 29 adăugiri și 14 ștergeri
  1. 25 10
      src/chanprog.cc
  2. 2 2
      src/chanprog.h
  3. 2 2
      src/mod/irc.mod/chan.cc

+ 25 - 10
src/chanprog.cc

@@ -144,29 +144,44 @@ struct userrec *check_chanlist_hand(const char *hand)
   return NULL;
 }
 
+/* Clear the user pointers in the chanlists.
+ *
+ * Necessary when a hostmask is added/removed, a user is added or a new
+ * userfile is loaded.
+ */
+void clear_chanlist(void)
+{
+  memberlist		*m = NULL;
+  struct chanset_t	*chan = NULL;
+
+  for (chan = chanset; chan; chan = chan->next) {
+    for (m = chan->channel.member; m && m->nick[0]; m = m->next) {
+      m->user = NULL;
+      m->tried_getuser = 0;
+    }
+  }
+
+  Auth::NullUsers(NULL);
+}
+
 /* Clear the user pointer of a specific nick in the chanlists.
  *
  * Necessary when a hostmask is added/removed, a nick changes, etc.
  * Does not completely invalidate the channel cache like clear_chanlist().
  */
-void clear_chanlist_member(const char *nick)
+void clear_chanlist_member(const RfcString& nick)
 {
   memberlist		*m = NULL;
   struct chanset_t	*chan = NULL;
 
   for (chan = chanset; chan; chan = chan->next) {
-    for (m = chan->channel.member; m && m->nick[0]; m = m->next) {
-      if (nick == NULL || !rfc_casecmp(m->nick, nick)) {
-	m->user = NULL;
-        m->tried_getuser = 0;
-        if (nick != NULL) {
-          break;
-        }
-      }
+    if ((m = ismember(chan, nick)) != NULL) {
+      m->user = NULL;
+      m->tried_getuser = 0;
     }
   }
 
-  Auth::NullUsers(nick);
+  Auth::NullUsers(nick.c_str());
 }
 
 /* If this user@host is in a channel, set it (it was null)

+ 2 - 2
src/chanprog.h

@@ -24,8 +24,8 @@ void check_timers();
 void check_utimers();
 void rmspace(char *s);
 void set_chanlist(const char *host, struct userrec *rec);
-void clear_chanlist_member(const char *nick);
-#define clear_chanlist() clear_chanlist_member(NULL)
+void clear_chanlist(void);
+void clear_chanlist_member(const RfcString& nick);
 bool bot_shouldjoin(struct userrec*, const struct flag_record *, const struct chanset_t *, bool = 0);
 bool shouldjoin(const struct chanset_t *);
 const char *samechans(const char *, const char *);

+ 2 - 2
src/mod/irc.mod/chan.cc

@@ -3072,13 +3072,13 @@ static int gotnick(char *from, char *msg)
   nick = splitnick(&uhost);
   fixcolon(msg);
   irc_log(NULL, "[%s] Nick change: %s -> %s", samechans(nick, ","), nick, msg);
-  clear_chanlist_member(nick);	/* Cache for nick 'nick' is meaningless now. */
+  const RfcString rfc_nick(nick);
+  clear_chanlist_member(rfc_nick);	/* Cache for nick 'nick' is meaningless now. */
 
   Auth *auth = Auth::Find(uhost);
   if (auth)
     auth->NewNick(msg);
 
-  const RfcString rfc_nick(nick);
   auto new_rfc_nick = std::make_shared<RfcString>(msg);
 
   /* Compose a nick!user@host for the new nick */