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