aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShea Levy <shea@shealevy.com>2018-02-14 12:35:07 -0500
committerShea Levy <shea@shealevy.com>2018-02-14 18:26:37 -0500
commitac973a6d3c0ff2f505dece8e9f1508c6f77553a5 (patch)
tree1608d000ef10c094622cb9ba5c9aec639cd161ce
parent96d48318cb838cb67916e443266210c46fe4bf87 (diff)
monitor-fds: Fix on macOS.
Fixes #1871.
-rw-r--r--src/libutil/monitor-fd.hh30
1 files changed, 23 insertions, 7 deletions
diff --git a/src/libutil/monitor-fd.hh b/src/libutil/monitor-fd.hh
index e0ec66c01..5ee0b88ef 100644
--- a/src/libutil/monitor-fd.hh
+++ b/src/libutil/monitor-fd.hh
@@ -21,13 +21,29 @@ public:
MonitorFdHup(int fd)
{
thread = std::thread([fd]() {
- /* Wait indefinitely until a POLLHUP occurs. */
- struct pollfd fds[1];
- fds[0].fd = fd;
- fds[0].events = 0;
- if (poll(fds, 1, -1) == -1) abort(); // can't happen
- assert(fds[0].revents & POLLHUP);
- triggerInterrupt();
+ while (true) {
+ /* Wait indefinitely until a POLLHUP occurs. */
+ struct pollfd fds[1];
+ fds[0].fd = fd;
+ /* This shouldn't be necessary, but macOS doesn't seem to
+ like a zeroed out events field.
+ See rdar://37537852.
+ */
+ fds[0].events = POLLHUP;
+ auto count = poll(fds, 1, -1);
+ if (count == -1) abort(); // can't happen
+ /* This shouldn't happen, but can on macOS due to a bug.
+ See rdar://37550628.
+
+ This may eventually need a delay or further
+ coordination with the main thread if spinning proves
+ too harmful.
+ */
+ if (count == 0) continue;
+ assert(fds[0].revents & POLLHUP);
+ triggerInterrupt();
+ break;
+ }
});
};