From: serassio <> Date: Mon, 28 Aug 2006 16:11:10 +0000 (+0000) Subject: Windows port: Allow safe multithreaded usage of debug() X-Git-Tag: SQUID_3_0_PRE5~166 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=1bc874d7d53dbf3c3772e27e028df4b585984e33;p=thirdparty%2Fsquid.git Windows port: Allow safe multithreaded usage of debug() --- diff --git a/src/debug.cc b/src/debug.cc index 9fe6f65276..13bc44d59b 100644 --- a/src/debug.cc +++ b/src/debug.cc @@ -1,6 +1,6 @@ /* - * $Id: debug.cc,v 1.98 2006/05/08 23:38:33 robertc Exp $ + * $Id: debug.cc,v 1.99 2006/08/28 10:11:10 serassio Exp $ * * DEBUG: section 0 Debug Routines * AUTHOR: Harvest Derived @@ -54,6 +54,12 @@ static void _db_print_syslog(const char *format, va_list args); static void _db_print_stderr(const char *format, va_list args); static void _db_print_file(const char *format, va_list args); +#ifdef _SQUID_MSWIN_ +SQUIDCEXTERN LPCRITICAL_SECTION dbg_mutex; +typedef BOOL (WINAPI * PFInitializeCriticalSectionAndSpinCount) (LPCRITICAL_SECTION, DWORD); + +#endif + void #if STDC_HEADERS _db_print(const char *format,...) @@ -74,6 +80,39 @@ va_dcl #else #define args2 args1 #define args3 args1 +#endif +#ifdef _SQUID_MSWIN_ + /* Multiple WIN32 threads may call this simultaneously */ + + if (!dbg_mutex) + { + HMODULE krnl_lib = GetModuleHandle("Kernel32"); + PFInitializeCriticalSectionAndSpinCount InitializeCriticalSectionAndSpinCount = NULL; + + if (krnl_lib) + InitializeCriticalSectionAndSpinCount = + (PFInitializeCriticalSectionAndSpinCount) GetProcAddress(krnl_lib, + "InitializeCriticalSectionAndSpinCount"); + + dbg_mutex = static_cast(xcalloc(1, sizeof(CRITICAL_SECTION))); + + if (InitializeCriticalSectionAndSpinCount) { + /* let multiprocessor systems EnterCriticalSection() fast */ + + if (!InitializeCriticalSectionAndSpinCount(dbg_mutex, 4000)) { + if (debug_log) { + fprintf(debug_log, "FATAL: _db_print: can't initialize critical section\n"); + fflush(debug_log); + } + + fprintf(stderr, "FATAL: _db_print: can't initialize critical section\n"); + abort(); + } else + InitializeCriticalSection(dbg_mutex); + } + } + + EnterCriticalSection(dbg_mutex); #endif /* give a chance to context-based debugging to print current context */ @@ -106,6 +145,11 @@ va_dcl _db_print_syslog(format, args3); +#endif +#ifdef _SQUID_MSWIN_ + + LeaveCriticalSection(dbg_mutex); + #endif va_end(args1); diff --git a/src/win32.cc b/src/win32.cc index 75919e161f..fffc6cf01c 100644 --- a/src/win32.cc +++ b/src/win32.cc @@ -1,6 +1,6 @@ /* - * $Id: win32.cc,v 1.19 2006/04/29 13:53:16 serassio Exp $ + * $Id: win32.cc,v 1.20 2006/08/28 10:11:10 serassio Exp $ * * * * * * * * * Legal stuff * * * * * * * * @@ -71,6 +71,7 @@ void Squid_Win32InvalidParameterHandler(const wchar_t*, const wchar_t*, const wc #endif static int Win32SockInit(void); static void Win32SockCleanup(void); +SQUIDCEXTERN LPCRITICAL_SECTION dbg_mutex; void WIN32_ExceptionHandlerCleanup(void); static LPTOP_LEVEL_EXCEPTION_FILTER Win32_Old_ExceptionHandler = NULL; static int s_iInitCount = 0; @@ -412,6 +413,9 @@ WIN32_Exit() #endif #ifdef _SQUID_MSWIN_ + if (dbg_mutex) + DeleteCriticalSection(dbg_mutex); + WIN32_ExceptionHandlerCleanup(); #endif