parent
96d48318cb
commit
ac973a6d3c
|
@ -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;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue