]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
Windows port: Allow safe multithreaded usage of debug()
authorserassio <>
Mon, 28 Aug 2006 16:11:10 +0000 (16:11 +0000)
committerserassio <>
Mon, 28 Aug 2006 16:11:10 +0000 (16:11 +0000)
src/debug.cc
src/win32.cc

index 9fe6f652764675878474ef379f792555cc1718bf..13bc44d59bf7a3f18c10328b19dbf3d2fc182fb8 100644 (file)
@@ -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<CRITICAL_SECTION*>(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);
index 75919e161f893bd5cebbe8db7e9aa9106a36205e..fffc6cf01cff1a3e97815b7eb677e1186771e3a9 100644 (file)
@@ -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