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]