From: Simon Marlow Date: Thu, 9 Feb 2006 12:30:56 +0000 (+0000) Subject: improvement to the deadlock detection X-Git-Url: http://git.megacz.com/?a=commitdiff_plain;h=6ff106616c1c98542df0a1763f0f9f655b2c8dd5;p=ghc-hetmet.git 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. --- diff --git a/ghc/rts/Timer.c b/ghc/rts/Timer.c index 425ada5..b6414f8 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) {