From d6c835a7502c7a9358228cab2c2afd14b0f70293 Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Wed, 29 Jun 2016 08:56:29 -0700 Subject: [PATCH] test/common/Throttle.cc: fix race in shutdown Previously, putters could stop before getters. Keep putters running until getters stop and the queue is empty. Signed-off-by: Samuel Just --- src/test/common/Throttle.cc | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/test/common/Throttle.cc b/src/test/common/Throttle.cc index 3581fd3363a69..d75d450a8e083 100644 --- a/src/test/common/Throttle.cc +++ b/src/test/common/Throttle.cc @@ -276,7 +276,8 @@ std::pair > test_backoff( std::condition_variable c; uint64_t total = 0; std::list in_queue; - bool stop = false; + bool stop_getters = false; + bool stop_putters = false; auto wait_time = std::chrono::duration(0); uint64_t waits = 0; @@ -301,7 +302,7 @@ std::pair > test_backoff( std::uniform_int_distribution<> dis(0, 10); std::unique_lock g(l); - while (!stop) { + while (!stop_getters) { g.unlock(); uint64_t to_get = dis(gen); @@ -318,9 +319,11 @@ std::pair > test_backoff( auto putter = [&]() { std::unique_lock g(l); - while (!stop) { - while (in_queue.empty()) + while (!stop_putters || !in_queue.empty()) { + if (in_queue.empty()) { c.wait(g); + continue; + } uint64_t c = in_queue.front(); @@ -348,10 +351,17 @@ std::pair > test_backoff( std::this_thread::sleep_for(std::chrono::duration(5)); { std::unique_lock g(l); - stop = true; + stop_getters = true; + c.notify_all(); } for (auto &&i: gts) i.join(); gts.clear(); + + { + std::unique_lock g(l); + stop_putters = true; + c.notify_all(); + } for (auto &&i: pts) i.join(); pts.clear(); -- 2.39.5