From d4bd17a2dcc3ac0ea2c773c5dce88e37c9a87d1a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Adrien=20B=C3=A9raud?= <adrien.beraud@savoirfairelinux.com>
Date: Wed, 19 Oct 2016 13:30:23 -0400
Subject: [PATCH] dhtrunner: use a second condition variable for bootstrap

---
 include/opendht/dhtrunner.h |  1 +
 src/dhtrunner.cpp           | 18 ++++++++++++------
 src/network_engine.cpp      |  4 +++-
 3 files changed, 16 insertions(+), 7 deletions(-)

diff --git a/include/opendht/dhtrunner.h b/include/opendht/dhtrunner.h
index 09229eb9..b8e0572f 100644
--- a/include/opendht/dhtrunner.h
+++ b/include/opendht/dhtrunner.h
@@ -388,6 +388,7 @@ private:
     std::thread bootstrap_thread {};
     /** protects bootstrap_nodes, bootstrap_thread */
     std::mutex bootstrap_mtx {};
+    std::condition_variable bootstrap_cv {};
 
     std::queue<std::function<void(SecureDht&)>> pending_ops_prio {};
     std::queue<std::function<void(SecureDht&)>> pending_ops {};
diff --git a/src/dhtrunner.cpp b/src/dhtrunner.cpp
index 0d5e2b2b..a8a3cf02 100644
--- a/src/dhtrunner.cpp
+++ b/src/dhtrunner.cpp
@@ -129,6 +129,7 @@ DhtRunner::join()
 {
     running = false;
     cv.notify_all();
+    bootstrap_cv.notify_all();
     if (dht_thread.joinable())
         dht_thread.join();
     if (rcv_thread.joinable())
@@ -606,16 +607,21 @@ DhtRunner::tryBootstrapCoutinuously()
 
             next += BOOTSTRAP_PERIOD;
             {
-                std::mutex mtx; // dummy mutex
+                std::mutex mtx;
                 std::unique_lock<std::mutex> blck(mtx);
-                std::atomic<unsigned> ping_count(0);
+                unsigned ping_count(0);
                 // Reverse: try last inserted bootstrap nodes first
                 for (auto it = nodes.rbegin(); it != nodes.rend(); it++) {
                     ++ping_count;
                     try {
                         bootstrap(getAddrInfo(it->first, it->second), [&](bool) {
-                            --ping_count;
-                            cv.notify_all();
+                            if (not running)
+                                return;
+                            {
+                                std::unique_lock<std::mutex> blck(mtx);
+                                --ping_count;
+                            }
+                            bootstrap_cv.notify_all();
                         });
                     } catch (std::invalid_argument& e) {
                         --ping_count;
@@ -623,10 +629,10 @@ DhtRunner::tryBootstrapCoutinuously()
                     }
                 }
                 // wait at least until the next BOOTSTRAP_PERIOD
-                cv.wait_until(blck, next, [&]() { return not running; });
+                bootstrap_cv.wait_until(blck, next, [&]() { return not running; });
                 // wait for bootstrap requests to end.
                 if (running)
-                    cv.wait(blck, [&]() { return not running or ping_count == 0; });
+                   bootstrap_cv.wait(blck, [&]() { return not running or ping_count == 0; });
             }
             // update state
             {
diff --git a/src/network_engine.cpp b/src/network_engine.cpp
index 9141bc4f..18ce38c0 100644
--- a/src/network_engine.cpp
+++ b/src/network_engine.cpp
@@ -250,8 +250,10 @@ NetworkEngine::sendRequest(std::shared_ptr<Request>& request)
 {
     request->start = scheduler.time();
     auto e = requests.emplace(request->tid, request);
-    if (!e.second)
+    if (!e.second) {
         DHT_LOG_ERR("Request already existed (tid: %d)!", request->tid);
+        return;
+    }
     request->node->requested(request);
     requestStep(request);
 }
-- 
GitLab