postgres.git / summary / log / commit / refs
commit b2b4af535eb733ba0c2ea6eeb2b14cac7f1ca4be
Author: Heikki Linnakangas <heikki.linnakangas@iki.fi>
Date: Sun Jan 15 20:03:09 2012 +0000
First released in: 9.2.0
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.
src/backend/port/unix_latch.c | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
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;
}
[parent: 0495aaad8b33]