From f1ca51549e9e7045a2db95a61744334f1dbb4d64 Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Mon, 14 May 2012 10:57:07 -0400
Subject: [PATCH] Force pgwin32_recv into nonblock mode when called from
 pgstat.c.

This should get rid of the usage of pgwin32_waitforsinglesocket entirely,
and perhaps thereby remove the race condition that's evidently still
present on some versions of Windows.  The previous arrangement was a bit
unsafe anyway, since waiting at the recv() would not allow pgstat to notice
postmaster death.
---
 src/backend/postmaster/pgstat.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c
index cb437770830..4c2cc655723 100644
--- a/src/backend/postmaster/pgstat.c
+++ b/src/backend/postmaster/pgstat.c
@@ -3117,9 +3117,21 @@ PgstatCollectorMain(int argc, char *argv[])
 			/*
 			 * Try to receive and process a message.  This will not block,
 			 * since the socket is set to non-blocking mode.
+			 *
+			 * XXX On Windows, we have to force pgwin32_recv to cooperate.
+			 * This is extremely broken and should be fixed someday.
 			 */
+#ifdef WIN32
+			pgwin32_noblock = 1;
+#endif
+
 			len = recv(pgStatSock, (char *) &msg,
 					   sizeof(PgStat_Msg), 0);
+
+#ifdef WIN32
+			pgwin32_noblock = 0;
+#endif
+
 			if (len < 0)
 			{
 				if (errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR)
-- 
GitLab