]> granicus.if.org Git - postgresql/commitdiff
Force pgwin32_recv into nonblock mode when called from pgstat.c.
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 14 May 2012 14:57:07 +0000 (10:57 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 14 May 2012 14:57:07 +0000 (10:57 -0400)
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

index cb4377708302f4a407a48b6ca448c805c3700e3d..4c2cc6557235568d1c546e696cc788893862c6d9 100644 (file)
@@ -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)