summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane2012-05-14 14:57:07 +0000
committerTom Lane2012-05-14 14:57:07 +0000
commitf1ca51549e9e7045a2db95a61744334f1dbb4d64 (patch)
treeec00c777633865591c7d54cf6f30a0c946b4e354
parentf15c2eae9c2f36830fae40935bd8cdcede4b75a0 (diff)
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.
-rw-r--r--src/backend/postmaster/pgstat.c12
1 files changed, 12 insertions, 0 deletions
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)