]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
fixed cancel_event with SafeTimer
authorsageweil <sageweil@29311d96-e01e-0410-9327-a35deaab8ce9>
Tue, 30 Jan 2007 20:11:51 +0000 (20:11 +0000)
committersageweil <sageweil@29311d96-e01e-0410-9327-a35deaab8ce9>
Tue, 30 Jan 2007 20:11:51 +0000 (20:11 +0000)
git-svn-id: https://ceph.svn.sf.net/svnroot/ceph@1053 29311d96-e01e-0410-9327-a35deaab8ce9

branches/sage/cephmds2/common/Timer.cc
branches/sage/cephmds2/common/Timer.h

index dc47dc66e382487f7ee681be3393c97125ea92b3..7dc1f75e34d3200e75712d23c9b2d2e05a29a7ff 100644 (file)
@@ -97,8 +97,9 @@ void Timer::timer_entry()
           for (list<Context*>::iterator cit = pending.begin();
                cit != pending.end();
                cit++) {
-            dout(DBL) << "doing callback " << *cit << endl;
+            dout(DBL) << "start callback " << *cit << endl;
             (*cit)->finish(0);
+            dout(DBL) << "finish callback " << *cit << endl;
            delete *cit;
           }
           pending.clear();
@@ -242,15 +243,19 @@ bool Timer::cancel_event(Context *callback)
 void SafeTimer::add_event_after(float seconds, Context *c)
 {
   assert(lock.is_locked());
-  g_timer.add_event_after(seconds, new EventWrapper(this, c));
-  scheduled.insert(c);
+  Context *w = new EventWrapper(this, c);
+  dout(DBL) << "SafeTimer.add_event_after wrapping " << c << " with " << w << endl;
+  scheduled[c] = w;
+  g_timer.add_event_after(seconds, w);
 }
 
 void SafeTimer::add_event_at(utime_t when, Context *c)
 {
   assert(lock.is_locked());
-  g_timer.add_event_at(when, new EventWrapper(this, c));
-  scheduled.insert(c);
+  Context *w = new EventWrapper(this, c);
+  dout(DBL) << "SafeTimer.add_event_at wrapping " << c << " with " << w << endl;
+  scheduled[c] = w;
+  g_timer.add_event_at(when, w);
 }
 
 void SafeTimer::EventWrapper::finish(int r)
@@ -274,19 +279,19 @@ void SafeTimer::cancel_event(Context *c)
 {
   assert(lock.is_locked());
   assert(scheduled.count(c));
+  if (!g_timer.cancel_event(scheduled[c])) 
+    canceled[c] = scheduled[c];
   scheduled.erase(c);
-  if (!g_timer.cancel_event(c)) 
-    canceled.insert(c);
 }
 
 void SafeTimer::cancel_all()
 {
   assert(lock.is_locked());
-  for (set<Context*>::iterator p = scheduled.begin();
+  for (map<Context*,Context*>::iterator p = scheduled.begin();
        p != scheduled.end();
        ++p) 
-    if (!g_timer.cancel_event(*p)) 
-      canceled.insert(*p);
+    if (!g_timer.cancel_event(p->second))
+      canceled[p->first] = p->second;
   scheduled.clear();
 }
 
index 8ac216b93eee289729e8dad23bb3bc5317ee2878..88d9929ac5ae1725ed8e85312db18e96a28ca295 100644 (file)
@@ -142,8 +142,8 @@ class Timer {
 class SafeTimer {
   Mutex&        lock;
   Cond          cond;
-  set<Context*> scheduled;
-  set<Context*> canceled;
+  map<Context*,Context*> scheduled;  // actual -> wrapper
+  map<Context*,Context*> canceled;
   
   class EventWrapper : public Context {
     SafeTimer *timer;