*** 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;
  	}
