summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHeikki Linnakangas2012-01-15 20:03:09 +0000
committerHeikki Linnakangas2012-01-15 20:08:03 +0000
commitb2b4af535eb733ba0c2ea6eeb2b14cac7f1ca4be (patch)
tree8bf07107a96fa487a013a1430c474f03b7cb5391
parent0495aaad8b337642830a4d4e82f8b8c02b27b1be (diff)
Fix poll() implementation of WaitLatchOrSocket to notice postmaster death.
When the remote end of the pipe is closed, select() reports the fd as readable, but poll() has a separate POLLHUP return code for that. Spotted by Peter Geoghegan.
-rw-r--r--src/backend/port/unix_latch.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/src/backend/port/unix_latch.c b/src/backend/port/unix_latch.c
index fc1a579ad2a..10bf2dbec7e 100644
--- a/src/backend/port/unix_latch.c
+++ b/src/backend/port/unix_latch.c
@@ -310,8 +310,13 @@ WaitLatchOrSocket(volatile Latch *latch, int wakeEvents, pgsocket sock,
{
result |= WL_SOCKET_WRITEABLE;
}
+ /*
+ * We expect a POLLHUP when the remote end is closed, but because we
+ * don't expect the pipe to become readable or to have any errors
+ * either, treat those as postmaster death, too.
+ */
if ((wakeEvents & WL_POSTMASTER_DEATH) &&
- (pfds[nfds - 1].revents & POLLIN))
+ (pfds[nfds - 1].revents & (POLLHUP | POLLIN | POLLERR | POLLNVAL)))
{
result |= WL_POSTMASTER_DEATH;
}