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