Commit dd24d6bc authored by Simon Marlow's avatar Simon Marlow

Disable the timer signal while blocked in select() (#5991)

The threaded RTS had a fix for this a long time ago (#1623) but this
patch applies a similar fix to the non-threaded RTS.
parent d6e3f3d2
......@@ -196,10 +196,19 @@ awaitEvent(rtsBool wait)
ptv = NULL;
}
/* Check for any interesting events */
while ((numFound = select(maxfd+1, &rfd, &wfd, NULL, ptv)) < 0) {
if (errno != EINTR) {
while (1) { // repeat the select on EINTR
// Disable the timer signal while blocked in
// select(), to conserve power. (#1623, #5991)
if (wait) stopTimer();
numFound = select(maxfd+1, &rfd, &wfd, NULL, ptv);
if (wait) startTimer();
if (numFound >= 0) break;
if (errno != EINTR) {
/* Handle bad file descriptors by unblocking all the
waiting threads. Why? Because a thread might have been
a bit naughty and closed a file descriptor while another
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment