]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
Finisher: call signal if necessary in function queue 3145/head
authorXinze Chi <xmdxcxz@gmail.com>
Thu, 11 Dec 2014 04:33:34 +0000 (04:33 +0000)
committerXinze Chi <xmdxcxz@gmail.com>
Thu, 11 Dec 2014 04:33:34 +0000 (04:33 +0000)
Signed-off-by: Xinze Chi <xmdxcxz@gmail.com>
src/common/Finisher.h

index 76a3944ac9e3eff0dd8078ec24178d1bc5955fd0..3a5b4e393efb05fd3192295f140ecfb417f9cce1 100644 (file)
@@ -49,20 +49,24 @@ class Finisher {
  public:
   void queue(Context *c, int r = 0) {
     finisher_lock.Lock();
+    if (finisher_queue.empty()) {
+      finisher_cond.Signal();
+    }
     if (r) {
       finisher_queue_rval.push_back(pair<Context*, int>(c, r));
       finisher_queue.push_back(NULL);
     } else
       finisher_queue.push_back(c);
-    finisher_cond.Signal();
     if (logger)
       logger->inc(l_finisher_queue_len);
     finisher_lock.Unlock();
   }
   void queue(vector<Context*>& ls) {
     finisher_lock.Lock();
+    if (finisher_queue.empty()) {
+      finisher_cond.Signal();
+    }
     finisher_queue.insert(finisher_queue.end(), ls.begin(), ls.end());
-    finisher_cond.Signal();
     if (logger)
       logger->inc(l_finisher_queue_len, ls.size());
     finisher_lock.Unlock();
@@ -70,8 +74,10 @@ class Finisher {
   }
   void queue(deque<Context*>& ls) {
     finisher_lock.Lock();
+    if (finisher_queue.empty()) {
+      finisher_cond.Signal();
+    }
     finisher_queue.insert(finisher_queue.end(), ls.begin(), ls.end());
-    finisher_cond.Signal();
     if (logger)
       logger->inc(l_finisher_queue_len, ls.size());
     finisher_lock.Unlock();
@@ -79,8 +85,10 @@ class Finisher {
   }
   void queue(list<Context*>& ls) {
     finisher_lock.Lock();
+    if (finisher_queue.empty()) {
+      finisher_cond.Signal();
+    }
     finisher_queue.insert(finisher_queue.end(), ls.begin(), ls.end());
-    finisher_cond.Signal();
     if (logger)
       logger->inc(l_finisher_queue_len, ls.size());
     finisher_lock.Unlock();