From 43fd60f86a3fb7a0cfc209eb8bd40eafda6f3a13 Mon Sep 17 00:00:00 2001 From: pasta Date: Sun, 8 Dec 2024 17:30:46 -0600 Subject: [PATCH] perf: make m_peer_mutex a SharedMutex --- src/net_processing.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/net_processing.cpp b/src/net_processing.cpp index c93252eb0a84..4804d513e661 100644 --- a/src/net_processing.cpp +++ b/src/net_processing.cpp @@ -814,7 +814,7 @@ class PeerManagerImpl final : public PeerManager /** Protects m_peer_map. This mutex must not be locked while holding a lock * on any of the mutexes inside a Peer object. */ - mutable Mutex m_peer_mutex; + mutable SharedMutex m_peer_mutex; /** * Map of all Peer objects, keyed by peer id. This map is protected * by the m_peer_mutex. Once a shared pointer reference is @@ -1723,7 +1723,7 @@ void PeerManagerImpl::FinalizeNode(const CNode& node) { PeerRef PeerManagerImpl::GetPeerRef(NodeId id) const { - LOCK(m_peer_mutex); + READ_LOCK(m_peer_mutex); auto it = m_peer_map.find(id); return it != m_peer_map.end() ? it->second : nullptr; } @@ -2292,7 +2292,7 @@ bool PeerManagerImpl::AlreadyHaveBlock(const uint256& block_hash) void PeerManagerImpl::SendPings() { - LOCK(m_peer_mutex); + READ_LOCK(m_peer_mutex); for(auto& it : m_peer_map) it.second->m_ping_queued = true; } @@ -2302,7 +2302,7 @@ void PeerManagerImpl::AskPeersForTransaction(const uint256& txid) peersToAsk.reserve(4); { - LOCK(m_peer_mutex); + READ_LOCK(m_peer_mutex); // TODO consider prioritizing MNs again, once that flag is moved into Peer for (const auto& [_, peer] : m_peer_map) { if (peersToAsk.size() >= 4) { @@ -2358,7 +2358,7 @@ void PeerManagerImpl::RelayInv(const CInv& inv, const int minProtoVersion) void PeerManagerImpl::RelayInv(const CInv& inv) { - LOCK(m_peer_mutex); + READ_LOCK(m_peer_mutex); for (const auto& [_, peer] : m_peer_map) { if (!peer->GetInvRelay()) continue; PushInv(*peer, inv); @@ -2370,7 +2370,7 @@ void PeerManagerImpl::RelayDSQ(const CCoinJoinQueue& queue) CInv inv{MSG_DSQ, queue.GetHash()}; std::vector nodes_send_all; { - LOCK(m_peer_mutex); + READ_LOCK(m_peer_mutex); for (const auto& [nodeid, peer] : m_peer_map) { switch (peer->m_wants_dsq) { case Peer::WantsDSQ::NONE: @@ -2453,7 +2453,7 @@ void PeerManagerImpl::RelayTransaction(const uint256& txid) void PeerManagerImpl::_RelayTransaction(const uint256& txid) { const CInv inv{m_dstxman.GetDSTX(txid) ? MSG_DSTX : MSG_TX, txid}; - LOCK(m_peer_mutex); + READ_LOCK(m_peer_mutex); for(auto& it : m_peer_map) { Peer& peer = *it.second; auto tx_relay = peer.GetTxRelay(); @@ -2466,7 +2466,7 @@ void PeerManagerImpl::_RelayTransaction(const uint256& txid) void PeerManagerImpl::RelayRecoveredSig(const uint256& sigHash) { const CInv inv{MSG_QUORUM_RECOVERED_SIG, sigHash}; - LOCK(m_peer_mutex); + READ_LOCK(m_peer_mutex); for (const auto& [_, peer] : m_peer_map) { if (peer->m_wants_recsigs) { PushInv(*peer, inv); @@ -2504,7 +2504,7 @@ void PeerManagerImpl::RelayAddress(NodeId originator, std::array, 2> best{{{0, nullptr}, {0, nullptr}}}; assert(nRelayNodes <= best.size()); - LOCK(m_peer_mutex); + READ_LOCK(m_peer_mutex); for (auto& [id, peer] : m_peer_map) { if (peer->m_addr_relay_enabled && id != originator && IsAddrCompatible(*peer, addr)) {