Merge pull request #1872 from shlevy/macOS-poll-fix

monitor-fds: Fix on macOS.
This commit is contained in:
Eelco Dolstra 2018-02-15 11:43:56 +01:00 committed by GitHub
commit d26b71fda6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

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