summaryrefslogtreecommitdiff
path: root/rts/Timer.c
diff options
context:
space:
mode:
authorSimon Marlow <marlowsd@gmail.com>2012-09-21 15:49:22 +0100
committerSimon Marlow <marlowsd@gmail.com>2012-09-24 09:22:06 +0100
commit0b79d5cd4687dacf7efd430df7fba9d9a5a5ce32 (patch)
tree3efb44ff81ea3ed7496215961b4e57919375b77b /rts/Timer.c
parent673b6f50eca6f53cfb13b00e587c403c716baba1 (diff)
downloadhaskell-0b79d5cd4687dacf7efd430df7fba9d9a5a5ce32.tar.gz
Another overhaul of the recent_activity / idle GC handling (#5991)
Improvements: - we now turn off the timer signal in the non-threaded RTS after idleGCDelay. This should make the xmonad users on #5991 happy. - we now turn off the timer signal after idleGCDelay even if the idle GC is disabled with +RTS -I0. - we now do *not* turn off the timer when profiling. - more comments to explain the meaning of the various ACTIVITY_* values
Diffstat (limited to 'rts/Timer.c')
-rw-r--r--rts/Timer.c29
1 files changed, 15 insertions, 14 deletions
diff --git a/rts/Timer.c b/rts/Timer.c
index 3f9bc8ab0c..aa4b8d8fd7 100644
--- a/rts/Timer.c
+++ b/rts/Timer.c
@@ -28,10 +28,8 @@
/* ticks left before next pre-emptive context switch */
static int ticks_to_ctxt_switch = 0;
-#if defined(THREADED_RTS)
/* idle ticks left before we perform a GC */
static int ticks_to_gc = 0;
-#endif
/*
* Function: handle_tick()
@@ -52,8 +50,7 @@ handle_tick(int unused STG_UNUSED)
}
}
-#if defined(THREADED_RTS)
- /*
+ /*
* If we've been inactive for idleGCDelayTime (set by +RTS
* -I), tell the scheduler to wake up and do a GC, to check
* for threads that are deadlocked.
@@ -66,24 +63,28 @@ handle_tick(int unused STG_UNUSED)
break;
case ACTIVITY_MAYBE_NO:
if (ticks_to_gc == 0) {
- /* 0 ==> no idle GC */
- recent_activity = ACTIVITY_DONE_GC;
- // disable timer signals (see #1623)
- stopTimer();
- } else {
- ticks_to_gc--;
- if (ticks_to_gc == 0) {
- ticks_to_gc = RtsFlags.GcFlags.idleGCDelayTime /
- RtsFlags.MiscFlags.tickInterval;
+ if (RtsFlags.GcFlags.doIdleGC) {
recent_activity = ACTIVITY_INACTIVE;
+#ifdef THREADED_RTS
wakeUpRts();
+ // The scheduler will call stopTimer() when it has done
+ // the GC.
+#endif
+ } else {
+ recent_activity = ACTIVITY_DONE_GC;
+ // disable timer signals (see #1623, #5991)
+ // but only if we're not profiling
+#ifndef PROFILING
+ stopTimer();
+#endif
}
+ } else {
+ ticks_to_gc--;
}
break;
default:
break;
}
-#endif
}
// This global counter is used to allow multiple threads to stop the