From fbe44761c0743bab0e270171218409213fd70f8d Mon Sep 17 00:00:00 2001 From: Alexander Block Date: Fri, 12 Apr 2019 12:58:42 +0200 Subject: [PATCH] Don't wake up select if it was already woken up (#2863) This avoids calling WakeupSelect() for each node instead of just once. --- src/net.cpp | 8 +++++--- src/net.h | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/net.cpp b/src/net.cpp index 7f46d85d186e3..8b4b809f51d42 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -1321,10 +1321,10 @@ void CConnman::ThreadSocketHandler() } } - isInSelect = true; + wakeupSelectNeeded = true; int nSelect = select(have_fds ? hSocketMax + 1 : 0, &fdsetRecv, &fdsetSend, &fdsetError, &timeout); - isInSelect = false; + wakeupSelectNeeded = false; if (interruptNet) return; @@ -1521,6 +1521,8 @@ void CConnman::WakeSelect() LogPrint("net", "write to wakeupPipe failed\n"); } #endif + + wakeupSelectNeeded = false; } @@ -3236,7 +3238,7 @@ void CConnman::PushMessage(CNode* pnode, CSerializedNetMsg&& msg, bool allowOpti if (optimisticSend == true) nBytesSent = SocketSendData(pnode); // wake up select() call in case there was no pending data before (so it was not selecting this socket for sending) - else if (!hasPendingData && isInSelect) + else if (!hasPendingData && wakeupSelectNeeded) WakeSelect(); } if (nBytesSent) diff --git a/src/net.h b/src/net.h index a09b6b85052bf..4bf1a8206f59c 100644 --- a/src/net.h +++ b/src/net.h @@ -546,7 +546,7 @@ class CConnman /** a pipe which is added to select() calls to wakeup before the timeout */ int wakeupPipe[2]{-1,-1}; #endif - std::atomic isInSelect{false}; + std::atomic wakeupSelectNeeded{false}; std::thread threadDNSAddressSeed; std::thread threadSocketHandler;