[net] Don't try to take cs_inventory before deleting CNode

The TRY_LOCK(cs_inventory) in DisconnectNodes() is taken after the CNode
object has been removed from vNodes and when the CNode's nRefCount is
zero.

The only other places that cs_inventory can be taken are:

- In ProcessMessages() or SendMessages(), when the CNode's nRefCount
must be >0 (see ThreadMessageHandler(), where the refcount is
incremented before calling ProcessMessages() and SendMessages()).
- In a ForEachNode() lambda in PeerLogicValidation::UpdatedBlockTip().
ForEachNode() locks cs_vNodes and calls the function on the CNode
objects in vNodes.

Therefore, cs_inventory is never locked by another thread when the
TRY_LOCK(cs_inventory) is reached in DisconnectNodes(). Since the
only purpose of this TRY_LOCK is to ensure that the lock is not
taken by another thread, this always succeeds. Remove the check.
This commit is contained in:
John Newbery committed 2020-06-23 08:46:05 -04:00
1 parent 3556227ddd
commit e8a2822119
1 file changed
-3
-3
View File
@@ -1103,14 +1103,11 @@ void CConnman::DisconnectNodes()
if (pnode->GetRefCount() <= 0) { if (pnode->GetRefCount() <= 0) {
bool fDelete = false; bool fDelete = false;
{ {
TRY_LOCK(pnode->cs_inventory, lockInv);
if (lockInv) {
TRY_LOCK(pnode->cs_vSend, lockSend); TRY_LOCK(pnode->cs_vSend, lockSend);
if (lockSend) { if (lockSend) {
fDelete = true; fDelete = true;
} }
} }
}
if (fDelete) { if (fDelete) {
vNodesDisconnected.remove(pnode); vNodesDisconnected.remove(pnode);
DeleteNode(pnode); DeleteNode(pnode);