]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
common/Finisher: kill the need for lock for ContextQueue::empty()
authorIgor Fedotov <ifedotov@suse.com>
Mon, 5 Aug 2019 14:38:09 +0000 (17:38 +0300)
committerIgor Fedotov <ifedotov@suse.com>
Mon, 5 Aug 2019 16:42:23 +0000 (19:42 +0300)
Signed-off-by: Igor Fedotov <ifedotov@suse.com>
src/common/Finisher.h

index d76674027c7a6ce9e251a5aef042777e540fc6f8..3b6f9e45523080b69ac183ea5cb6cfaaa5bfc9ee 100644 (file)
@@ -195,24 +195,26 @@ class ContextQueue {
   std::mutex q_mutex;
   ceph::mutex& mutex;
   ceph::condition_variable& cond;
+  std::atomic_bool q_empty = true;
 public:
   ContextQueue(ceph::mutex& mut,
               ceph::condition_variable& con)
     : mutex(mut), cond(con) {}
 
   void queue(std::list<Context *>& ls) {
-    bool empty = false;
+    bool was_empty = false;
     {
       std::scoped_lock l(q_mutex);
       if (q.empty()) {
        q.swap(ls);
-       empty = true;
+       was_empty = true;
       } else {
        q.insert(q.end(), ls.begin(), ls.end());
       }
+      q_empty = q.empty();
     }
 
-    if (empty) {
+    if (was_empty) {
       std::scoped_lock l{mutex};
       cond.notify_all();
     }
@@ -226,11 +228,11 @@ public:
     if (!q.empty()) {
       q.swap(ls);
     }
+    q_empty = true;
   }
 
   bool empty() {
-    std::scoped_lock l(q_mutex);
-    return q.empty();
+    return q_empty;
   }
 };