From a7ad763bcbc0fa592134cebe5d6d6cd8c7f48f0e Mon Sep 17 00:00:00 2001 From: MarcoFalke Date: Fri, 8 Feb 2019 08:58:27 -0500 Subject: [PATCH] Merge #15201: net: Add missing locking annotation for vNodes. vNodes is guarded by cs_vNodes. eea02be70e Add locking annotation for vNodes. vNodes is guarded by cs_vNodes. (practicalswift) Pull request description: Add locking annotation for `vNodes`. `vNodes` is guarded by `cs_vNodes`. Tree-SHA512: b1e18be22ba5b9dd153536380321b09b30a75a20575f975af9af94164f51982b32267ba0994e77c801513b59da05d923a974a9d2dfebdac48024c4bda98b53af --- src/net.h | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/net.h b/src/net.h index 5551f08caa..a64479c79d 100644 --- a/src/net.h +++ b/src/net.h @@ -210,7 +210,18 @@ public: CConnman(uint64_t seed0, uint64_t seed1); ~CConnman(); bool Start(CScheduler& scheduler, const Options& options); - void Stop(); + + // TODO: Remove NO_THREAD_SAFETY_ANALYSIS. Lock cs_vNodes before reading the variable vNodes. + // + // When removing NO_THREAD_SAFETY_ANALYSIS be aware of the following lock order requirements: + // * CheckForStaleTipAndEvictPeers locks cs_main before indirectly calling GetExtraOutboundCount + // which locks cs_vNodes. + // * ProcessMessage locks cs_main and g_cs_orphans before indirectly calling ForEachNode which + // locks cs_vNodes. + // + // Thus the implicit locking order requirement is: (1) cs_main, (2) g_cs_orphans, (3) cs_vNodes. + void Stop() NO_THREAD_SAFETY_ANALYSIS; + void Interrupt(); bool GetNetworkActive() const { return fNetworkActive; }; bool GetUseAddrmanOutgoing() const { return m_use_addrman_outgoing; }; @@ -561,7 +572,7 @@ private: std::map, std::set> masternodeQuorumRelayMembers; // protected by cs_vPendingMasternodes std::set masternodePendingProbes; mutable CCriticalSection cs_vPendingMasternodes; - std::vector vNodes; + std::vector vNodes GUARDED_BY(cs_vNodes); std::list vNodesDisconnected; std::unordered_map mapSocketToNode; mutable CCriticalSection cs_vNodes;