diff --git a/src/net.h b/src/net.h --- a/src/net.h +++ b/src/net.h @@ -173,7 +173,21 @@ ~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; }; void SetNetworkActive(bool active); @@ -386,7 +400,7 @@ CCriticalSection cs_vOneShots; std::vector vAddedNodes GUARDED_BY(cs_vAddedNodes); CCriticalSection cs_vAddedNodes; - std::vector vNodes; + std::vector vNodes GUARDED_BY(cs_vNodes); std::list vNodesDisconnected; mutable CCriticalSection cs_vNodes; std::atomic nLastNodeId{0};