From 2f7a9997c88822696edbad38b14c5658c4630e9d Mon Sep 17 00:00:00 2001
From: gavinandresen <gavinandresen@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
Date: Tue, 16 Nov 2010 17:41:44 +0000
Subject: [PATCH 1/2] Make OutputDebugStringF thread-safe again (thanks ArtForz
 for catching)

git-svn-id: https://bitcoin.svn.sourceforge.net/svnroot/bitcoin/trunk@182 1a98c847-1fd6-4fd8-948a-caf3550aa51b
---
 util.cpp | 48 ++++++++++++++++++++++++++----------------------
 1 file changed, 26 insertions(+), 22 deletions(-)

diff --git a/util.cpp b/util.cpp
index 5ba0fb510..771c65788 100644
--- a/util.cpp
+++ b/util.cpp
@@ -145,6 +145,8 @@ int GetRandInt(int nMax)
 
 inline int OutputDebugStringF(const char* pszFormat, ...)
 {
+    static CCriticalSection cs_OutputDebugStringF;
+
     int ret = 0;
     if (fPrintToConsole)
     {
@@ -156,29 +158,32 @@ inline int OutputDebugStringF(const char* pszFormat, ...)
     }
     else
     {
-        // print to debug.log
-        static FILE* fileout = NULL;
-        static int64 nOpenTime = 0;
+        CRITICAL_BLOCK(cs_OutputDebugStringF)
+        {
+            // print to debug.log
+            static FILE* fileout = NULL;
+            static int64 nOpenTime = 0;
 
-        if (GetTime()-nOpenTime > 10 * 60)
-        {
+            if (GetTime()-nOpenTime > 10 * 60)
+            {
+                if (fileout)
+                    fclose(fileout);
+                char pszFile[MAX_PATH+100];
+                GetDataDir(pszFile);
+                strlcat(pszFile, "/debug.log", sizeof(pszFile));
+                fileout = fopen(pszFile, "a");
+                nOpenTime = GetTime();
+            }
             if (fileout)
-                fclose(fileout);
-            char pszFile[MAX_PATH+100];
-            GetDataDir(pszFile);
-            strlcat(pszFile, "/debug.log", sizeof(pszFile));
-            fileout = fopen(pszFile, "a");
-            nOpenTime = GetTime();
-        }
-        if (fileout)
-        {
-            //// Debug print useful for profiling
-            //fprintf(fileout, " %"PRI64d" ", GetTimeMillis());
-            va_list arg_ptr;
-            va_start(arg_ptr, pszFormat);
-            ret = vfprintf(fileout, pszFormat, arg_ptr);
-            va_end(arg_ptr);
-            fflush(fileout);
+            {
+                //// Debug print useful for profiling
+                //fprintf(fileout, " %"PRI64d" ", GetTimeMillis());
+                va_list arg_ptr;
+                va_start(arg_ptr, pszFormat);
+                ret = vfprintf(fileout, pszFormat, arg_ptr);
+                va_end(arg_ptr);
+                fflush(fileout);
+            }
         }
     }
 
@@ -186,7 +191,6 @@ inline int OutputDebugStringF(const char* pszFormat, ...)
     if (fPrintToDebugger)
     {
         // accumulate a line at a time
-        static CCriticalSection cs_OutputDebugStringF;
         CRITICAL_BLOCK(cs_OutputDebugStringF)
         {
             static char pszBuffer[50000];

From c4679ad0f1d4370d2d441c5091358d16854b8102 Mon Sep 17 00:00:00 2001
From: gavinandresen <gavinandresen@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
Date: Thu, 18 Nov 2010 00:11:33 +0000
Subject: [PATCH 2/2] OutputDebugStringF fix for Mac FileVault problem, take 3
 (cannot use a CRITICAL_BLOCK because of undefined order calling static
 destructors; instead, keep debug.log open, and tell people to use
 copytruncate when doing log rotation)

git-svn-id: https://bitcoin.svn.sourceforge.net/svnroot/bitcoin/trunk@183 1a98c847-1fd6-4fd8-948a-caf3550aa51b
---
 util.cpp | 47 ++++++++++++++++++++---------------------------
 1 file changed, 20 insertions(+), 27 deletions(-)

diff --git a/util.cpp b/util.cpp
index 771c65788..7576beaba 100644
--- a/util.cpp
+++ b/util.cpp
@@ -145,8 +145,6 @@ int GetRandInt(int nMax)
 
 inline int OutputDebugStringF(const char* pszFormat, ...)
 {
-    static CCriticalSection cs_OutputDebugStringF;
-
     int ret = 0;
     if (fPrintToConsole)
     {
@@ -158,38 +156,33 @@ inline int OutputDebugStringF(const char* pszFormat, ...)
     }
     else
     {
-        CRITICAL_BLOCK(cs_OutputDebugStringF)
-        {
-            // print to debug.log
-            static FILE* fileout = NULL;
-            static int64 nOpenTime = 0;
+        // print to debug.log
+        static FILE* fileout = NULL;
 
-            if (GetTime()-nOpenTime > 10 * 60)
-            {
-                if (fileout)
-                    fclose(fileout);
-                char pszFile[MAX_PATH+100];
-                GetDataDir(pszFile);
-                strlcat(pszFile, "/debug.log", sizeof(pszFile));
-                fileout = fopen(pszFile, "a");
-                nOpenTime = GetTime();
-            }
-            if (fileout)
-            {
-                //// Debug print useful for profiling
-                //fprintf(fileout, " %"PRI64d" ", GetTimeMillis());
-                va_list arg_ptr;
-                va_start(arg_ptr, pszFormat);
-                ret = vfprintf(fileout, pszFormat, arg_ptr);
-                va_end(arg_ptr);
-                fflush(fileout);
-            }
+        if (!fileout)
+        {
+            char pszFile[MAX_PATH+100];
+            GetDataDir(pszFile);
+            strlcat(pszFile, "/debug.log", sizeof(pszFile));
+            fileout = fopen(pszFile, "a");
+            setbuf(fileout, NULL); // unbuffered
+        }
+        if (fileout)
+        {
+            //// Debug print useful for profiling
+            //fprintf(fileout, " %"PRI64d" ", GetTimeMillis());
+            va_list arg_ptr;
+            va_start(arg_ptr, pszFormat);
+            ret = vfprintf(fileout, pszFormat, arg_ptr);
+            va_end(arg_ptr);
         }
     }
 
 #ifdef __WXMSW__
     if (fPrintToDebugger)
     {
+        static CCriticalSection cs_OutputDebugStringF;
+
         // accumulate a line at a time
         CRITICAL_BLOCK(cs_OutputDebugStringF)
         {