From 4aebef5e51b7deccb47abc89ef6e5b490ff82087 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrien=20B=C3=A9raud?= Date: Sun, 8 Nov 2015 15:27:07 -0500 Subject: [PATCH] dhtrunner: don't block networking thread during processing --- src/dhtrunner.cpp | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/dhtrunner.cpp b/src/dhtrunner.cpp index b5766d4a..e7b2cc01 100644 --- a/src/dhtrunner.cpp +++ b/src/dhtrunner.cpp @@ -167,18 +167,21 @@ DhtRunner::loop_() } time_point wakeup {}; + decltype(rcv) received {}; { std::lock_guard lck(sock_mtx); - if (not rcv.empty()) { - for (const auto& pck : rcv) { - auto& buf = pck.first; - auto& from = pck.second; - wakeup = dht_->periodic(buf.data(), buf.size()-1, (sockaddr*)&from.first, from.second); - } - rcv.clear(); - } else { - wakeup = dht_->periodic(nullptr, 0, nullptr, 0); + // move to stack + received = std::move(rcv); + } + if (not received.empty()) { + for (const auto& pck : received) { + auto& buf = pck.first; + auto& from = pck.second; + wakeup = dht_->periodic(buf.data(), buf.size()-1, (sockaddr*)&from.first, from.second); } + received.clear(); + } else { + wakeup = dht_->periodic(nullptr, 0, nullptr, 0); } Dht::Status nstatus4 = dht_->getStatus(AF_INET);