X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FTimer.c;fp=ghc%2Frts%2FTimer.c;h=425ada533fcd97546cb1d25f17a4e21359d696cd;hb=7b2ff4cc95ce49081d84c25184aec796377fbc35;hp=b6414f8b04580284b84681b74b53bdbc955eb501;hpb=ad68b91e2126681fba942f3038bcf32f9a1e7259;p=ghc-hetmet.git diff --git a/ghc/rts/Timer.c b/ghc/rts/Timer.c index b6414f8..425ada5 100644 --- a/ghc/rts/Timer.c +++ b/ghc/rts/Timer.c @@ -21,6 +21,7 @@ #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; @@ -30,6 +31,10 @@ 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() * @@ -60,7 +65,8 @@ handle_tick(int unused STG_UNUSED) recent_activity = ACTIVITY_MAYBE_NO; ticks_to_gc = RtsFlags.GcFlags.idleGCDelayTicks; break; - case ACTIVITY_MAYBE_NO: + case ACTIVITY_MAYBE_NO: { + OSThreadId id; if (ticks_to_gc == 0) break; /* 0 ==> no idle GC */ ticks_to_gc--; if (ticks_to_gc == 0) { @@ -69,14 +75,15 @@ handle_tick(int unused STG_UNUSED) blackholes_need_checking = rtsTrue; /* hack: re-use the blackholes_need_checking flag */ - /* 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? + /* 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: */ - prodOneCapability(); + createOSThread(&id, proddingThread, NULL); } break; + } default: break; } @@ -85,6 +92,15 @@ 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) {