Skip to content

Commit

Permalink
Fix infinite loop with LogPrint on Windows
Browse files Browse the repository at this point in the history
Running -printtodebugger -debug (or -debug=lock),
compiled with -DDEBUG_LOCKORDER would infinite loop
on Windows because every critical section lock/unlock
triggers a LogPrint.

Solution is to use the raw boost mutex instead of a CCriticalSection.
  • Loading branch information
gavinandresen committed Dec 10, 2013
1 parent 955787f commit 962b1cf
Showing 1 changed file with 14 additions and 17 deletions.
31 changes: 14 additions & 17 deletions src/util.cpp
Expand Up @@ -299,27 +299,24 @@ int LogPrint(const char* category, const char* pszFormat, ...)
#ifdef WIN32
if (fPrintToDebugger)
{
static CCriticalSection cs_OutputDebugStringF;

// accumulate and output a line at a time
{
LOCK(cs_OutputDebugStringF);
static std::string buffer;
static std::string buffer;

va_list arg_ptr;
va_start(arg_ptr, pszFormat);
buffer += vstrprintf(pszFormat, arg_ptr);
va_end(arg_ptr);
boost::mutex::scoped_lock scoped_lock(*mutexDebugLog);

int line_start = 0, line_end;
while((line_end = buffer.find('\n', line_start)) != -1)
{
OutputDebugStringA(buffer.substr(line_start, line_end - line_start).c_str());
line_start = line_end + 1;
ret += line_end-line_start;
}
buffer.erase(0, line_start);
va_list arg_ptr;
va_start(arg_ptr, pszFormat);
buffer += vstrprintf(pszFormat, arg_ptr);
va_end(arg_ptr);

int line_start = 0, line_end;
while((line_end = buffer.find('\n', line_start)) != -1)
{
OutputDebugStringA(buffer.substr(line_start, line_end - line_start).c_str());
line_start = line_end + 1;
ret += line_end-line_start;
}
buffer.erase(0, line_start);
}
#endif
return ret;
Expand Down

0 comments on commit 962b1cf

Please sign in to comment.