Fix wallet locking locking
authorPieter Wuille <pieter.wuille@gmail.com>
Sat, 11 Feb 2012 15:35:40 +0000 (16:35 +0100)
committerPieter Wuille <pieter.wuille@gmail.com>
Sat, 11 Feb 2012 20:59:39 +0000 (21:59 +0100)
src/bitcoinrpc.cpp

index 5d38f04..8f98135 100644 (file)
@@ -1539,33 +1539,31 @@ void ThreadCleanWalletPassphrase(void* parg)
 {
     int64 nMyWakeTime = GetTime() + *((int*)parg);
 
+    ENTER_CRITICAL_SECTION(cs_nWalletUnlockTime);
+
     if (nWalletUnlockTime == 0)
     {
-        CRITICAL_BLOCK(cs_nWalletUnlockTime)
-        {
-            nWalletUnlockTime = nMyWakeTime;
-        }
+        nWalletUnlockTime = nMyWakeTime;
 
         while (GetTime() < nWalletUnlockTime)
-            Sleep(GetTime() - nWalletUnlockTime);
-
-        CRITICAL_BLOCK(cs_nWalletUnlockTime)
         {
-            nWalletUnlockTime = 0;
+            int64 nToSleep = GetTime() - nWalletUnlockTime;
+
+            LEAVE_CRITICAL_SECTION(cs_nWalletUnlockTime);
+            Sleep(nToSleep);
+            ENTER_CRITICAL_SECTION(cs_nWalletUnlockTime);
         }
+
+        nWalletUnlockTime = 0;
+        pwalletMain->Lock();
     }
     else
     {
-        CRITICAL_BLOCK(cs_nWalletUnlockTime)
-        {
-            if (nWalletUnlockTime < nMyWakeTime)
-                nWalletUnlockTime = nMyWakeTime;
-        }
-        delete (int*)parg;
-        return;
+        if (nWalletUnlockTime < nMyWakeTime)
+            nWalletUnlockTime = nMyWakeTime;
     }
 
-    pwalletMain->Lock();
+    LEAVE_CRITICAL_SECTION(cs_nWalletUnlockTime);
 
     delete (int*)parg;
 }