From 2f7a9997c88822696edbad38b14c5658c4630e9d Mon Sep 17 00:00:00 2001 From: gavinandresen 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; - - if (GetTime()-nOpenTime > 10 * 60) + CRITICAL_BLOCK(cs_OutputDebugStringF) { + // print to debug.log + static FILE* fileout = NULL; + static int64 nOpenTime = 0; + + 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 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) {