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:43 +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 0a810cd22528ab2680d14173069f0adb1820e6a1..546796e1b8e20c68d62eb605fe22e60ddf3565d9 100644 (file)
@@ -50,13 +50,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