Fix potential deadlock
authorPieter Wuille <pieter.wuille@gmail.com>
Tue, 17 Apr 2012 16:50:45 +0000 (18:50 +0200)
committerLuke Dashjr <luke-jr+git@utopios.org>
Tue, 17 Apr 2012 19:11:48 +0000 (15:11 -0400)
Conflict:
* cs_main in ProcessMessages() (before calling ProcessMessages)
* cs_vSend in CNode::BeginMessage
versus:
* cs_vSend in ThreadMessageHandler2 (before calling SendMessages)
* cs_main in SendMessages

Even though cs_vSend is a try_lock, if it succeeds simultaneously with
the locking of cs_main in ProcessMessages(), it could cause a deadlock.

src/main.cpp

index 76e0783..e6f9421 100644 (file)
@@ -2618,7 +2618,7 @@ bool ProcessMessages(CNode* pfrom)
 
 bool SendMessages(CNode* pto, bool fSendTrickle)
 {
-    CRITICAL_BLOCK(cs_main)
+    TRY_CRITICAL_BLOCK(cs_main)
     {
         // Don't send anything until we get their version message
         if (pto->nVersion == 0)