monitor-fds: Fix on macOS.

Fixes #1871.
This commit is contained in:
Shea Levy 2018-02-14 12:35:07 -05:00
parent 96d48318cb
commit ac973a6d3c
No known key found for this signature in database
GPG key ID: 5C0BD6957D86FE27

View file

@ -21,13 +21,29 @@ public:
MonitorFdHup(int fd) MonitorFdHup(int fd)
{ {
thread = std::thread([fd]() { thread = std::thread([fd]() {
while (true) {
/* Wait indefinitely until a POLLHUP occurs. */ /* Wait indefinitely until a POLLHUP occurs. */
struct pollfd fds[1]; struct pollfd fds[1];
fds[0].fd = fd; fds[0].fd = fd;
fds[0].events = 0; /* This shouldn't be necessary, but macOS doesn't seem to
if (poll(fds, 1, -1) == -1) abort(); // can't happen 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); assert(fds[0].revents & POLLHUP);
triggerInterrupt(); triggerInterrupt();
break;
}
}); });
}; };