X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FCapability.h;h=dd6a7bee0c131f6c35f3ab54cc4f7b3dfad561cf;hb=95f1b72e5398f6d4b694ff7a62e73243dd9a6ee9;hp=6aef3dbad21f4e9f3edf6280fe4b598e1a26d76e;hpb=efa41d9d5eada7aa3230a2bd03b97a8b7025ef2e;p=ghc-hetmet.git diff --git a/ghc/rts/Capability.h b/ghc/rts/Capability.h index 6aef3db..dd6a7be 100644 --- a/ghc/rts/Capability.h +++ b/ghc/rts/Capability.h @@ -32,13 +32,21 @@ extern void initCapabilities(void); extern void grabCapability(Capability** pCap); extern void releaseCapability(Capability* cap); -#if defined(RTS_SUPPORTS_THREADS) -/* total number of available capabilities */ extern nat rts_n_free_capabilities; +#if defined(RTS_SUPPORTS_THREADS) +/* number of worker threads waiting for a return capability + */ extern nat rts_n_waiting_workers; -extern void grabReturnCapability(Capability** pCap); -extern void yieldCapability(Capability* cap); +extern void grabReturnCapability(Mutex* pMutex, Capability** pCap); +extern void yieldToReturningWorker(Mutex* pMutex, Capability** pCap); +extern void waitForWorkCapability(Mutex* pMutex, Capability** pCap, rtsBool runnable); + + +static inline rtsBool needToYieldToReturningWorker(void) +{ + return rts_n_waiting_workers > 0; +} static inline nat getFreeCapabilities (void) {