Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
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:48 +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 e5e750a702c254ab77687d656e7e3e0fbba3c16c..e5bcd33859d27c13036f7a90ef4fd2656edd6f63 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