]> granicus.if.org Git - postgresql/commitdiff
Fix WaitLatchOrSocket to handle EOF on socket correctly.
authorTom Lane <tgl@sss.pgh.pa.us>
Sat, 12 May 2012 20:36:47 +0000 (16:36 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Sat, 12 May 2012 20:36:47 +0000 (16:36 -0400)
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.

src/backend/port/unix_latch.c

index 30d1a488f0a0541760091f95321df15d3c395ccc..409beaed8dcbc0545a45ccb79332533732ec19a4 100644 (file)
@@ -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;