From bb74dc846c3ba2aabb1a8494f895a348723ff0b7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Simon=20D=C3=A9saulniers?= <sim.desaulniers@gmail.com>
Date: Fri, 23 Sep 2016 15:24:41 -0400
Subject: [PATCH] dht/dhtrunner: enable callback for pingNode

---
 include/opendht/dht.h       |  2 +-
 include/opendht/dhtrunner.h |  4 ++--
 src/dht.cpp                 | 13 +++++++++----
 src/dhtrunner.cpp           | 17 ++++++++++++-----
 4 files changed, 24 insertions(+), 12 deletions(-)

diff --git a/include/opendht/dht.h b/include/opendht/dht.h
index db3b4d99..f01e2c08 100644
--- a/include/opendht/dht.h
+++ b/include/opendht/dht.h
@@ -121,7 +121,7 @@ public:
         insertNode(n.id, SockAddr(n.ss, n.sslen));
     }
 
-    void pingNode(const sockaddr*, socklen_t);
+    void pingNode(const sockaddr*, socklen_t, DoneCallbackSimple&& cb={});
 
     time_point periodic(const uint8_t *buf, size_t buflen, const SockAddr&);
     time_point periodic(const uint8_t *buf, size_t buflen, const sockaddr* from, socklen_t fromlen) {
diff --git a/include/opendht/dhtrunner.h b/include/opendht/dhtrunner.h
index 42fd7f71..6def61d5 100644
--- a/include/opendht/dhtrunner.h
+++ b/include/opendht/dhtrunner.h
@@ -197,8 +197,8 @@ public:
     }
     void putEncrypted(const std::string& key, InfoHash to, Value&& value, DoneCallback cb={});
 
-    void bootstrap(const char* host, const char* service);
-    void bootstrap(const std::vector<std::pair<sockaddr_storage, socklen_t>>& nodes);
+    void bootstrap(const char* host, const char* service, DoneCallbackSimple&& cb={});
+    void bootstrap(const std::vector<std::pair<sockaddr_storage, socklen_t>>& nodes, DoneCallbackSimple&& cb={});
     void bootstrap(const std::vector<NodeExport>& nodes);
 
     /**
diff --git a/src/dht.cpp b/src/dht.cpp
index 352cc878..19477f06 100644
--- a/src/dht.cpp
+++ b/src/dht.cpp
@@ -2990,17 +2990,22 @@ Dht::insertNode(const InfoHash& id, const SockAddr& addr)
 }
 
 void
-Dht::pingNode(const sockaddr* sa, socklen_t salen)
+Dht::pingNode(const sockaddr* sa, socklen_t salen, DoneCallbackSimple&& cb)
 {
     scheduler.syncTime();
     DHT_LOG.DEBUG("Sending ping to %s", print_addr(sa, salen).c_str());
     auto& count = sa->sa_family == AF_INET ? pending_pings4 : pending_pings6;
     count++;
-    network_engine.sendPing(sa, salen, [&](const Request&, NetworkEngine::RequestAnswer&&) {
+    network_engine.sendPing(sa, salen, [&count,cb](const Request&, NetworkEngine::RequestAnswer&&) {
         count--;
-    }, [&](const Request&, bool last){
-        if (last)
+        if (cb)
+            cb(true);
+    }, [&count,cb](const Request&, bool last){
+        if (last) {
             count--;
+            if (cb)
+                cb(false);
+        }
     });
 }
 
diff --git a/src/dhtrunner.cpp b/src/dhtrunner.cpp
index fd96c16a..ee1a07f4 100644
--- a/src/dhtrunner.cpp
+++ b/src/dhtrunner.cpp
@@ -597,18 +597,25 @@ DhtRunner::getAddrInfo(const char* host, const char* service)
 }
 
 void
-DhtRunner::bootstrap(const char* host, const char* service)
+DhtRunner::bootstrap(const char* host, const char* service, DoneCallbackSimple&& cb)
 {
-    bootstrap(getAddrInfo(host, service));
+    bootstrap(getAddrInfo(host, service), std::forward<DoneCallbackSimple>(cb));
 }
 
 void
-DhtRunner::bootstrap(const std::vector<std::pair<sockaddr_storage, socklen_t>>& nodes)
+DhtRunner::bootstrap(const std::vector<std::pair<sockaddr_storage, socklen_t>>& nodes, DoneCallbackSimple&& cb)
 {
     std::lock_guard<std::mutex> lck(storage_mtx);
-    pending_ops_prio.emplace([=](SecureDht& dht) {
+    pending_ops_prio.emplace([=](SecureDht& dht) mutable {
+        auto rem = std::make_shared<std::pair<size_t, bool>>(nodes.size(), false);
         for (auto& node : nodes)
-            dht.pingNode((sockaddr*)&node.first, node.second);
+            dht.pingNode((sockaddr*)&node.first, node.second, [rem,cb](bool ok) {
+                auto& r = *rem;
+                r.first--;
+                r.second |= ok;
+                if (not r.first)
+                    cb(r.second);
+            });
     });
     cv.notify_all();
 }
-- 
GitLab