Repository : ssh://darcs.haskell.org//srv/darcs/ghc On branch : master
http://hackage.haskell.org/trac/ghc/changeset/dd24d6bc37879c6b32a3d5ac4ee765e59e13501c >--------------------------------------------------------------- commit dd24d6bc37879c6b32a3d5ac4ee765e59e13501c Author: Simon Marlow <[email protected]> Date: Wed Apr 11 10:12:14 2012 +0100 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. >--------------------------------------------------------------- rts/posix/Select.c | 15 ++++++++++++--- 1 files changed, 12 insertions(+), 3 deletions(-) diff --git a/rts/posix/Select.c b/rts/posix/Select.c index 1edf6bc..dc40b70 100644 --- a/rts/posix/Select.c +++ b/rts/posix/Select.c @@ -196,10 +196,19 @@ awaitEvent(rtsBool wait) ptv = NULL; } - /* Check for any interesting events */ + while (1) { // repeat the select on EINTR - while ((numFound = select(maxfd+1, &rfd, &wfd, NULL, ptv)) < 0) { - if (errno != 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 _______________________________________________ Cvs-ghc mailing list [email protected] http://www.haskell.org/mailman/listinfo/cvs-ghc
