]> granicus.if.org Git - postgresql/commitdiff
Here's a patch implementing the "thread method" to workaround the bug
authorBruce Momjian <bruce@momjian.us>
Wed, 24 Mar 2004 04:04:51 +0000 (04:04 +0000)
committerBruce Momjian <bruce@momjian.us>
Wed, 24 Mar 2004 04:04:51 +0000 (04:04 +0000)
with socket calls in signal handlers (APC) on Win32. See details in mail
to pgsql-hackers-win32 a couple of minutes ago.

Magnus Hagander

src/backend/postmaster/postmaster.c

index 671e0644d7c1ead00908eb2c985c92146211ac91..4d7eee8897cce4ae9d04550a7bc314e5ca9da981 100644 (file)
@@ -37,7 +37,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/postmaster/postmaster.c,v 1.376 2004/03/23 01:23:48 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/postmaster/postmaster.c,v 1.377 2004/03/24 04:04:51 momjian Exp $
  *
  * NOTES
  *
@@ -2016,6 +2016,36 @@ reaper_done:
        errno = save_errno;
 }
 
+
+#ifdef WIN32
+/* 
+ * On WIN32, we cannot use socket functions inside
+ * an APC (signal handler). If we do, select() will return
+ * with incorrect return values, causing the postmaster to
+ * enter a blocking accept(). We work around this by
+ * running it on a separate thread. We still block the main 
+ * thread until it is done, so we don't scribble over any
+ * data from the wrong thread (pgstat functions aqre not
+ * thread safe).
+ */
+static DWORD WINAPI win32_pgstat_beterm_thread(LPVOID param)
+{
+       pgstat_beterm((int)param);
+       return 0;
+}
+
+static void win32_pgstat_beterm(int pid) {
+       HANDLE beterm_thread = CreateThread(NULL, 64*1024, win32_pgstat_beterm_thread, (LPVOID)pid, 0, NULL);
+       if (!beterm_thread)
+               ereport(FATAL,
+                               (errmsg_internal("failed to create beterm sender thread: %i", (int)GetLastError())));
+       if (WaitForSingleObject(beterm_thread,INFINITE) != WAIT_OBJECT_0)
+               ereport(FATAL,
+                               (errmsg_internal("failed to wait for beterm sender thread: %i", (int)GetLastError())));
+       CloseHandle(beterm_thread);
+}
+#endif
+
 /*
  * CleanupProc -- cleanup after terminated backend.
  *
@@ -2069,7 +2099,11 @@ CleanupProc(int pid,
                else if (pid == BgWriterPID)
                        BgWriterPID = 0;
                else
+#ifndef WIN32
                        pgstat_beterm(pid);
+#else
+                   win32_pgstat_beterm(pid);
+#endif
 
                return;
        }