summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Marlow <marlowsd@gmail.com>2012-09-21 15:26:46 +0100
committerSimon Marlow <marlowsd@gmail.com>2012-09-24 09:22:06 +0100
commit673b6f50eca6f53cfb13b00e587c403c716baba1 (patch)
tree2ab6202bc39298e580c4de9c8d47567f7ee7ad5a
parent096c29dfe1fd7273b0ef0f2e4b49ddbc6a3928b1 (diff)
downloadhaskell-673b6f50eca6f53cfb13b00e587c403c716baba1.tar.gz
Revert "Disable the timer signal while blocked in select() (#5991)"
This reverts commit dd24d6bc37879c6b32a3d5ac4ee765e59e13501c. This attempt to fix the problem was misguided: the program might be stuck in a foreign call rather than awaitEvent(), and then the timer signal will never get disabled. The only way to turn off the timer signal in this case is in the timer interrupt handler itself.
-rw-r--r--rts/posix/Select.c17
1 files changed, 4 insertions, 13 deletions
diff --git a/rts/posix/Select.c b/rts/posix/Select.c
index d638829fc9..3d92a4666a 100644
--- a/rts/posix/Select.c
+++ b/rts/posix/Select.c
@@ -221,19 +221,10 @@ awaitEvent(rtsBool wait)
ptv = NULL;
}
- 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) {
+ /* Check for any interesting events */
+
+ 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
a bit naughty and closed a file descriptor while another