From: Jianpeng Ma Date: Thu, 20 Sep 2018 13:28:40 +0000 (+0800) Subject: common/Finisher: only queue empty only wake up waiter. X-Git-Tag: v14.0.1~236^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=754f3aa44519029df6ce3b6a68e12b69171dbf14;p=ceph.git common/Finisher: only queue empty only wake up waiter. Signed-off-by: Jianpeng Ma --- diff --git a/src/common/Finisher.h b/src/common/Finisher.h index 4b6d2d3c8a1..94607ea21a6 100644 --- a/src/common/Finisher.h +++ b/src/common/Finisher.h @@ -193,18 +193,22 @@ public: ContextQueue(Mutex& mut, Cond& con) : mutex(mut), cond(con) {} void queue(list& ls) { + bool empty = false; { std::scoped_lock l(q_mutex); if (q.empty()) { q.swap(ls); + empty = true; } else { q.insert(q.end(), ls.begin(), ls.end()); } } - mutex.Lock(); - cond.SignalOne(); - mutex.Unlock(); + if (empty) { + mutex.Lock(); + cond.SignalOne(); + mutex.Unlock(); + } ls.clear(); }