*** postmaster.c.orig Mon Mar 22 20:33:32 2004 --- postmaster.c Mon Mar 22 20:47:44 2004 *************** *** 2023,2028 **** --- 2023,2055 ---- errno = save_errno; } + + /* + * 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); + } + /* * CleanupProc -- cleanup after terminated backend. * *************** *** 2076,2082 **** --- 2103,2113 ---- else if (pid == BgWriterPID) BgWriterPID = 0; else + #ifndef WIN32 pgstat_beterm(pid); + #else + win32_pgstat_beterm(pid); + #endif return; }