]> granicus.if.org Git - postgresql/commitdiff
Report success when Windows kill() emulation signals an exiting process.
authorNoah Misch <noah@leadboat.com>
Wed, 23 Jul 2014 04:35:13 +0000 (00:35 -0400)
committerNoah Misch <noah@leadboat.com>
Wed, 23 Jul 2014 04:36:40 +0000 (00:36 -0400)
This is consistent with the POSIX verdict that kill() shall not report
ESRCH for a zombie process.  Back-patch to 9.0 (all supported versions).
Test code from commit d7cdf6ee36adeac9233678fb8f2a112e6678a770 depends
on it, and log messages about kill() reporting "Invalid argument" will
cease to appear for this not-unexpected condition.

src/port/kill.c

index 5a7d483ce6178970495a0d0a41182ad17936e339..b33283e11e6f0761da848b60aec3892f2288a871 100644 (file)
@@ -70,13 +70,28 @@ pgkill(int pid, int sig)
                return 0;
        }
 
-       if (GetLastError() == ERROR_FILE_NOT_FOUND)
-               errno = ESRCH;
-       else if (GetLastError() == ERROR_ACCESS_DENIED)
-               errno = EPERM;
-       else
-               errno = EINVAL;
-       return -1;
+       switch (GetLastError())
+       {
+               case ERROR_BROKEN_PIPE:
+               case ERROR_BAD_PIPE:
+
+                       /*
+                        * These arise transiently as a process is exiting.  Treat them
+                        * like POSIX treats a zombie process, reporting success.
+                        */
+                       return 0;
+
+               case ERROR_FILE_NOT_FOUND:
+                       /* pipe fully gone, so treat the process as gone */
+                       errno = ESRCH;
+                       return -1;
+               case ERROR_ACCESS_DENIED:
+                       errno = EPERM;
+                       return -1;
+               default:
+                       errno = EINVAL;         /* unexpected */
+                       return -1;
+       }
 }
 
 #endif