Changeset View
Changeset View
Standalone View
Standalone View
src/init.cpp
Show First 20 Lines • Show All 220 Lines • ▼ Show 20 Lines | void Shutdown(NodeContext &node) { | ||||
// Because these depend on each-other, we make sure that neither can be | // Because these depend on each-other, we make sure that neither can be | ||||
// using the other before destroying them. | // using the other before destroying them. | ||||
if (node.peerman) { | if (node.peerman) { | ||||
UnregisterValidationInterface(node.peerman.get()); | UnregisterValidationInterface(node.peerman.get()); | ||||
} | } | ||||
// Follow the lock order requirements: | // Follow the lock order requirements: | ||||
// * CheckForStaleTipAndEvictPeers locks cs_main before indirectly calling | // * CheckForStaleTipAndEvictPeers locks cs_main before indirectly calling | ||||
// GetExtraOutboundCount which locks cs_vNodes. | // GetExtraFullOutboundCount which locks cs_vNodes. | ||||
// * ProcessMessage locks cs_main and g_cs_orphans before indirectly calling | // * ProcessMessage locks cs_main and g_cs_orphans before indirectly calling | ||||
// ForEachNode which locks cs_vNodes. | // ForEachNode which locks cs_vNodes. | ||||
// * CConnman::Stop calls DeleteNode, which calls FinalizeNode, which locks | // * CConnman::Stop calls DeleteNode, which calls FinalizeNode, which locks | ||||
// cs_main and calls EraseOrphansFor, which locks g_cs_orphans. | // cs_main and calls EraseOrphansFor, which locks g_cs_orphans. | ||||
// | // | ||||
// Thus the implicit locking order requirement is: | // Thus the implicit locking order requirement is: | ||||
// (1) cs_main, (2) g_cs_orphans, (3) cs_vNodes. | // (1) cs_main, (2) g_cs_orphans, (3) cs_vNodes. | ||||
if (node.connman) { | if (node.connman) { | ||||
▲ Show 20 Lines • Show All 2,866 Lines • Show Last 20 Lines |