summarylogtreecommitdiffstats
path: root/ps-issue-515_all.patch
blob: cd820cb2236126592317fbf5bb0cfcb71028a221 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
--- a/src/rpc/command_scheduler.cc
+++ b/src/rpc/command_scheduler.cc
@@ -63,15 +63,18 @@ CommandScheduler::insert(const std::string& key) {
   if (key.empty())
     throw torrent::input_error("Scheduler received an empty key.");
 
-  iterator itr = find(key);
+  CommandSchedulerItem* current = new CommandSchedulerItem(key);
+  current->slot() = std::tr1::bind(&CommandScheduler::call_item, this, current);
 
-  if (itr == end())
-    itr = base_type::insert(end(), NULL);
-  else
-    delete *itr;
-
-  *itr = new CommandSchedulerItem(key);
-  (*itr)->slot() = std::tr1::bind(&CommandScheduler::call_item, this, *itr);
+  iterator itr = find(key);
+  if (itr == end()) {
+    itr = base_type::insert(end(), current);
+  } else {
+    // swap in fully initialized command, and THEN delete the replaced one
+    CommandSchedulerItem* old = *itr;
+    *itr = current;
+    delete old;
+  }
 
   return itr;
 }