Repository : ssh://darcs.haskell.org//srv/darcs/ghc On branch : ghc-7.4
http://hackage.haskell.org/trac/ghc/changeset/e3b7e3352c6bba0bf7b6991e5485264a868e4800 >--------------------------------------------------------------- commit e3b7e3352c6bba0bf7b6991e5485264a868e4800 Author: Simon Marlow <[email protected]> Date: Mon Jan 16 09:49:24 2012 +0000 Fix bug causing polling instead of blocking in the non-threaded RTS (#5773) This was a regression introduced accidentally in 6b1098511aaabd2c9503ee7be6da1944466f9cb4. We were previously passing a large time value to select() to simulate blocking, and this broke due to a change from unsigned to signed arithmetic. I've refactored it to be less fragile now - we just pass NULL as the timeval parameter to select(), which is the correct way to do blocking. >--------------------------------------------------------------- rts/posix/Select.c | 33 ++++++++++++++++----------------- 1 files changed, 16 insertions(+), 17 deletions(-) diff --git a/rts/posix/Select.c b/rts/posix/Select.c index 45737ce..ffe72e8 100644 --- a/rts/posix/Select.c +++ b/rts/posix/Select.c @@ -118,13 +118,9 @@ awaitEvent(rtsBool wait) int maxfd = -1; rtsBool select_succeeded = rtsTrue; rtsBool unblock_all = rtsFalse; - struct timeval tv; - Time min; + struct timeval tv, *ptv; LowResTime now; - tv.tv_sec = 0; - tv.tv_usec = 0; - IF_DEBUG(scheduler, debugBelch("scheduler: checking for threads blocked on I/O"); if (wait) { @@ -145,14 +141,6 @@ awaitEvent(rtsBool wait) return; } - if (!wait) { - min = 0; - } else if (sleeping_queue != END_TSO_QUEUE) { - min = LowResTimeToTime(sleeping_queue->block_info.target - now); - } else { - min = (Time)-1; - } - /* * Collect all of the fd's that we're interested in */ @@ -194,12 +182,23 @@ awaitEvent(rtsBool wait) } } - /* Check for any interesting events */ + if (wait) { + ptv = NULL; + } else if (sleeping_queue != END_TSO_QUEUE) { + Time min = LowResTimeToTime(sleeping_queue->block_info.target - now); + tv.tv_sec = TimeToSeconds(min); + tv.tv_usec = TimeToUS(min) % 1000000; + ptv = &tv; + } else { + // just poll + tv.tv_sec = 0; + tv.tv_usec = 0; + ptv = &tv; + } - tv.tv_sec = TimeToSeconds(min); - tv.tv_usec = TimeToUS(min) % 1000000; + /* Check for any interesting events */ - while ((numFound = select(maxfd+1, &rfd, &wfd, NULL, &tv)) < 0) { + while ((numFound = select(maxfd+1, &rfd, &wfd, NULL, ptv)) < 0) { if (errno != EINTR) { /* Handle bad file descriptors by unblocking all the waiting threads. Why? Because a thread might have been _______________________________________________ Cvs-ghc mailing list [email protected] http://www.haskell.org/mailman/listinfo/cvs-ghc
