From: Tom Lane Date: Sat, 12 May 2012 20:36:47 +0000 (-0400) Subject: Fix WaitLatchOrSocket to handle EOF on socket correctly. X-Git-Tag: REL9_2_BETA2~96 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=31ad6553646c81f3ce8fccf8aef1a1134a7864c7;p=thirdparty%2Fpostgresql.git Fix WaitLatchOrSocket to handle EOF on socket correctly. When using poll(), EOF on a socket is reported with the POLLHUP not POLLIN flag (at least on Linux). WaitLatchOrSocket failed to check this bit, causing it to go into a busy-wait loop if EOF occurs. We earlier fixed the same mistake in the test for the state of the postmaster_alive socket, but missed it for the caller-supplied socket. Fortunately, this error is new in 9.2, since 9.1 only had a select() based code path not a poll() based one. --- diff --git a/src/backend/port/unix_latch.c b/src/backend/port/unix_latch.c index 30d1a488f0a..409beaed8dc 100644 --- a/src/backend/port/unix_latch.c +++ b/src/backend/port/unix_latch.c @@ -293,7 +293,7 @@ WaitLatchOrSocket(volatile Latch *latch, int wakeEvents, pgsocket sock, result |= WL_TIMEOUT; } if ((wakeEvents & WL_SOCKET_READABLE) && - (pfds[0].revents & POLLIN)) + (pfds[0].revents & (POLLIN | POLLHUP | POLLERR | POLLNVAL))) { /* data available in socket */ result |= WL_SOCKET_READABLE;