Przeglądaj źródła

HashTable.keys() removed

Bryan Drewery 7 lat temu
rodzic
commit
7a505f239c

+ 2 - 3
src/mod/channels.mod/chanmisc.cc

@@ -1047,9 +1047,8 @@ void clear_channel(struct chanset_t *chan, bool reset)
 
   if (chan->channel.cached_members) {
     if (chan->channel.cached_members->size()) {
-      for (const auto& uhost : chan->channel.cached_members->keys()) {
-        // Delete the cached member
-        m = (*chan->channel.cached_members)[uhost];
+      for (const auto& kv : *(chan->channel.cached_members)) {
+        m = kv.second;
         delete_member(m);
       }
     }

+ 9 - 6
src/mod/irc.mod/irc.cc

@@ -60,6 +60,7 @@ using std::swap;
 #include <bdlib/src/HashTable.h>
 #include <bdlib/src/base64.h>
 #include <deque>
+#include <vector>
 
 #include <stdarg.h>
 
@@ -1636,18 +1637,20 @@ check_expired_chanstuff(struct chanset_t *chan)
   }
   // Clear out expired cached members
   if (chan->channel.cached_members && chan->channel.cached_members->size()) {
-    bd::Array<bd::String> member_uhosts(chan->channel.cached_members->keys());
-    for (size_t i = 0; i < member_uhosts.length(); ++i) {
-      const bd::String uhost(member_uhosts[i]);
-
-      m = (*chan->channel.cached_members)[uhost];
+    std::vector<bd::String> expired_hosts;
+    for (const auto& kv : *(chan->channel.cached_members)) {
+      auto& uhost = kv.first;
+      m = kv.second;
 
       // Delete the expired member
       if (now - m->last > wait_split) {
         delete_member(m);
-        chan->channel.cached_members->remove(uhost);
+        expired_hosts.push_back(uhost);
       }
     }
+    for (const auto& uhost : expired_hosts) {
+      chan->channel.cached_members->remove(uhost);
+    }
   }
 }
 

+ 9 - 7
src/mod/server.mod/server.cc

@@ -51,6 +51,7 @@
 #include <bdlib/src/Array.h>
 #include "server.h"
 #include <stdarg.h>
+#include <vector>
 
 int default_alines = 5;		/* How many mode lines are assumed will work before throttling */
 bool floodless = 0;		/* floodless iline? */
@@ -1051,10 +1052,10 @@ static void server_secondly()
       }
 
       // Clear expired key exchanges that aren't finished (7 seconds)
-      const bd::Array<bd::String> fish_targets(FishKeys.keys());
-      for (size_t i = 0; i < fish_targets.length(); ++i) {
-        const bd::String target(fish_targets[i]);
-        fish_data_t* fishData = FishKeys[target];
+      std::vector<bd::String> expired_keys;
+      for (const auto& kv : FishKeys) {
+        auto& target = kv.first;
+        const auto fishData = kv.second;
         bool should_delete = false;
         if (fishData->key_created_at && !fishData->sharedKey && ((now - 7) >= fishData->key_created_at)) {
           putlog(LOG_DEBUG, "*", "Deleting expired DH1080 FiSH exchange with %s", target.c_str());
@@ -1063,13 +1064,14 @@ static void server_secondly()
           putlog(LOG_DEBUG, "*", "Deleting expired (60 min) FiSH key with %s", target.c_str());
           should_delete = true;
         }
-
         if (should_delete) {
-          FishKeys.remove(target);
           delete fishData;
+          expired_keys.push_back(target);
         }
       }
-
+      for (const auto& target : expired_keys) {
+        FishKeys.remove(target);
+      }
 
       cnt_10 = 0;
     } else {