Causes the event loop to exit on Posix when being interrupted by a signal.
Previously, the loop logic would simply retry the wait until the given timeout was actually reached (or an event got received), which could be forever. This change makes sure that after an interrupt the higher level code will get a chance to run to possibly handle the effects of the signal. This is a fix for vibe-d/vibe-core#205.
This commit is contained in:
parent
1e5f3f04ce
commit
07d5ead617
|
@ -57,7 +57,16 @@ final class EpollEventLoop : PosixEventLoop {
|
||||||
if (evt.events & EPOLLOUT) notify!(EventType.write)(fd);
|
if (evt.events & EPOLLOUT) notify!(EventType.write)(fd);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
} else return false;
|
} else {
|
||||||
|
// NOTE: In particular, EINTR needs to cause true to be returned
|
||||||
|
// here, so that user code has a chance to handle any effects
|
||||||
|
// of the signal handler before waiting again.
|
||||||
|
//
|
||||||
|
// Other errors are very likely to to reoccur for the next
|
||||||
|
// loop iteration, so there is no value in attempting to
|
||||||
|
// wait again.
|
||||||
|
return ret < 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override void dispose()
|
override void dispose()
|
||||||
|
|
|
@ -85,7 +85,16 @@ abstract class KqueueEventLoopBase : PosixEventLoop {
|
||||||
// EV_SIGNAL, EV_TIMEOUT
|
// EV_SIGNAL, EV_TIMEOUT
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
} else return false;
|
} else {
|
||||||
|
// NOTE: In particular, EINTR needs to cause true to be returned
|
||||||
|
// here, so that user code has a chance to handle any effects
|
||||||
|
// of the signal handler before waiting again.
|
||||||
|
//
|
||||||
|
// Other errors are very likely to to reoccur for the next
|
||||||
|
// loop iteration, so there is no value in attempting to
|
||||||
|
// wait again.
|
||||||
|
return ret < 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override void dispose()
|
override void dispose()
|
||||||
|
|
|
@ -65,7 +65,16 @@ final class SelectEventLoop : PosixEventLoop {
|
||||||
notify!(EventType.status)(fd);
|
notify!(EventType.status)(fd);
|
||||||
});
|
});
|
||||||
return true;
|
return true;
|
||||||
} else return false;
|
} else {
|
||||||
|
// NOTE: In particular, EINTR needs to cause true to be returned
|
||||||
|
// here, so that user code has a chance to handle any effects
|
||||||
|
// of the signal handler before waiting again.
|
||||||
|
//
|
||||||
|
// Other errors are very likely to to reoccur for the next
|
||||||
|
// loop iteration, so there is no value in attempting to
|
||||||
|
// wait again.
|
||||||
|
return ret < 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override void dispose()
|
override void dispose()
|
||||||
|
|
Loading…
Reference in a new issue