]> granicus.if.org Git - postgresql/commitdiff
Check for EOF on pipe differs under win32, as it is based on a socket
authorBruce Momjian <bruce@momjian.us>
Mon, 15 Mar 2004 16:21:37 +0000 (16:21 +0000)
committerBruce Momjian <bruce@momjian.us>
Mon, 15 Mar 2004 16:21:37 +0000 (16:21 +0000)
implementation.

Claudio Natoli

src/backend/postmaster/pgstat.c

index 95cd52e644226e015b6923539d82f9b78f308103..15cff4d144bb7d2ac29c23766e9e88ae8bf38be8 100644 (file)
@@ -13,7 +13,7 @@
  *
  *     Copyright (c) 2001-2003, PostgreSQL Global Development Group
  *
- *     $PostgreSQL: pgsql/src/backend/postmaster/pgstat.c,v 1.60 2004/03/10 21:12:46 momjian Exp $
+ *     $PostgreSQL: pgsql/src/backend/postmaster/pgstat.c,v 1.61 2004/03/15 16:21:37 momjian Exp $
  * ----------
  */
 #include "postgres.h"
@@ -1642,6 +1642,7 @@ pgstat_mainChild(PGSTAT_FORK_ARGS)
                         */
                        int                     nread = 0;
                        int                     targetlen = sizeof(PgStat_MsgHdr);              /* initial */
+                       bool            pipeEOF = false;
 
                        while (nread < targetlen)
                        {
@@ -1652,13 +1653,23 @@ pgstat_mainChild(PGSTAT_FORK_ARGS)
                                {
                                        if (errno == EINTR)
                                                continue;
+#ifdef WIN32
+                                       if (WSAGetLastError() == WSAECONNRESET) /* EOF on the pipe! (win32 socket based implementation) */
+                                       {
+                                               pipeEOF = true;
+                                               break;
+                                       }
+#endif
                                        ereport(LOG,
                                                        (errcode_for_socket_access(),
-                                        errmsg("could not read from statistics collector pipe: %m")));
+                                                        errmsg("could not read from statistics collector pipe: %m")));
                                        exit(1);
                                }
                                if (len == 0)   /* EOF on the pipe! */
+                               {
+                                       pipeEOF = true;
                                        break;
+                               }
                                nread += len;
                                if (nread == sizeof(PgStat_MsgHdr))
                                {
@@ -1683,7 +1694,7 @@ pgstat_mainChild(PGSTAT_FORK_ARGS)
                         * EOF on the pipe implies that the buffer process exited.
                         * Fall out of outer loop.
                         */
-                       if (len == 0)
+                       if (pipeEOF)
                                break;
 
                        /*