X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FCapability.c;h=3ea96fe7701990cd6aa1d183c84517e14faf5d45;hb=53386c359c55bd6eaa13c35fe174c9274ff5888e;hp=e34f47a4ce50be12069aa5aa889a67e5afc84c83;hpb=de02e02a50bfe799a7ac4bf55e088999be0b95d8;p=ghc-hetmet.git diff --git a/ghc/rts/Capability.c b/ghc/rts/Capability.c index e34f47a..3ea96fe 100644 --- a/ghc/rts/Capability.c +++ b/ghc/rts/Capability.c @@ -28,9 +28,10 @@ Capability MainCapability; /* for non-SMP, we have one global capability */ #endif +#if defined(RTS_SUPPORTS_THREADS) + nat rts_n_free_capabilities; -#if defined(RTS_SUPPORTS_THREADS) /* returning_worker_cond: when a worker thread returns from executing an * external call, it needs to wait for an RTS Capability before passing * on the result of the call to the Haskell thread that made it. @@ -107,15 +108,15 @@ static void initCapabilities_(nat n); void initCapabilities( void ) { -#if defined(RTS_SUPPORTS_THREADS) - initCondition(&returning_worker_cond); - initCondition(&thread_ready_cond); -#endif - #if defined(SMP) initCapabilities_(RtsFlags.ParFlags.nNodes); #else initCapability(&MainCapability); +#endif + +#if defined(RTS_SUPPORTS_THREADS) + initCondition(&returning_worker_cond); + initCondition(&thread_ready_cond); rts_n_free_capabilities = 1; #endif @@ -136,12 +137,17 @@ static Capability *returning_capabilities; threaded RTS, clients must use waitFor*Capability()). ------------------------------------------------------------------------- */ +#if defined(RTS_SUPPORTS_THREADS) +static +#endif void grabCapability( Capability** cap ) { #if !defined(SMP) +#if defined(RTS_SUPPORTS_THREADS) ASSERT(rts_n_free_capabilities == 1); rts_n_free_capabilities = 0; +#endif *cap = &MainCapability; handleSignalsInThisThread(); #else @@ -149,7 +155,9 @@ grabCapability( Capability** cap ) free_capabilities = (*cap)->link; rts_n_free_capabilities--; #endif +#if defined(RTS_SUPPORTS_THREADS) IF_DEBUG(scheduler, sched_belch("worker: got capability")); +#endif } /* ---------------------------------------------------------------------------- @@ -203,7 +211,9 @@ releaseCapability( Capability* cap UNUSED_IF_NOT_SMP ) rts_n_free_capabilities = 1; #endif // Signal that a capability is available - signalCondition(&thread_ready_cond); + if (rts_n_waiting_tasks > 0) { + signalCondition(&thread_ready_cond); + } startSchedulerTaskIfNecessary(); IF_DEBUG(scheduler, sched_belch("worker: released capability")); }