From: Noah Misch <noah@leadboat.com>
Date: Wed, 23 Jul 2014 04:35:13 +0000 (-0400)
Subject: Report success when Windows kill() emulation signals an exiting process.
X-Git-Tag: REL9_5_ALPHA1~1689
X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0ea1f2a3a8dfcbe8062a65a13700fc5ae83482c6;p=postgresql

Report success when Windows kill() emulation signals an exiting process.

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.
---

diff --git a/src/port/kill.c b/src/port/kill.c
index 5a7d483ce6..b33283e11e 100644
--- a/src/port/kill.c
+++ b/src/port/kill.c
@@ -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