diff options
author | Simon Marlow <simonmar@microsoft.com> | 2006-02-09 12:30:56 +0000 |
---|---|---|
committer | Simon Marlow <simonmar@microsoft.com> | 2006-02-09 12:30:56 +0000 |
commit | 6ff106616c1c98542df0a1763f0f9f655b2c8dd5 (patch) | |
tree | b8a37ba81c1bfda160359c7c9742f5daceac5463 /ghc/rts | |
parent | fd0529940130b3991e6bb51d1e2a870e614f829b (diff) | |
download | haskell-6ff106616c1c98542df0a1763f0f9f655b2c8dd5.tar.gz |
improvement to the deadlock detection
When the RTS is idle, as detected by the timer signal, instead of
prodding capabilities from the signal handler (which is not guaranteed
to work - pthread_cond_signal() can't be called from signal handlers),
create a new thread to do it.
Diffstat (limited to 'ghc/rts')
-rw-r--r-- | ghc/rts/Timer.c | 28 |
1 files changed, 6 insertions, 22 deletions
diff --git a/ghc/rts/Timer.c b/ghc/rts/Timer.c index 425ada533f..b6414f8b04 100644 --- a/ghc/rts/Timer.c +++ b/ghc/rts/Timer.c @@ -21,7 +21,6 @@ #include "Timer.h" #include "Ticker.h" #include "Capability.h" -#include "OSThreads.h" /* ticks left before next pre-emptive context switch */ static int ticks_to_ctxt_switch = 0; @@ -31,10 +30,6 @@ static int ticks_to_ctxt_switch = 0; static int ticks_to_gc = 0; #endif -#if defined(THREADED_RTS) -static void OSThreadProcAttr proddingThread(void *p); -#endif - /* * Function: handle_tick() * @@ -65,8 +60,7 @@ handle_tick(int unused STG_UNUSED) recent_activity = ACTIVITY_MAYBE_NO; ticks_to_gc = RtsFlags.GcFlags.idleGCDelayTicks; break; - case ACTIVITY_MAYBE_NO: { - OSThreadId id; + case ACTIVITY_MAYBE_NO: if (ticks_to_gc == 0) break; /* 0 ==> no idle GC */ ticks_to_gc--; if (ticks_to_gc == 0) { @@ -75,15 +69,14 @@ handle_tick(int unused STG_UNUSED) blackholes_need_checking = rtsTrue; /* hack: re-use the blackholes_need_checking flag */ - /* We can't prod the Capability from inside the - * signal handler, because pthread_cond_signal() - * doesn't work from signal handlers. Let's hope - * that pthread_create() works: + /* ToDo: this doesn't work. Can't invoke + * pthread_cond_signal from a signal handler. + * Furthermore, we can't prod a capability that we + * might be holding. What can we do? */ - createOSThread(&id, proddingThread, NULL); + prodOneCapability(); } break; - } default: break; } @@ -92,15 +85,6 @@ handle_tick(int unused STG_UNUSED) } } -#if defined(THREADED_RTS) -static void OSThreadProcAttr -proddingThread(void *p STG_UNUSED) -{ - prodOneCapability(); - // and exit again. -} -#endif - int startTimer(nat ms) { |