From b28761cb3176c22d7804504c753ef4892ae0356a Mon Sep 17 00:00:00 2001
From: Noah Misch <noah@leadboat.com>
Date: Wed, 23 Jul 2014 00:35:13 -0400
Subject: [PATCH] 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.
---
 src/port/kill.c | 29 ++++++++++++++++++++++-------
 1 file changed, 22 insertions(+), 7 deletions(-)

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