X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FCapability.h;h=dd6a7bee0c131f6c35f3ab54cc4f7b3dfad561cf;hb=3087014ae03067cf0f9c9e0d8d49fb885e2cd0a8;hp=e59f495874ae3e60e6e57ea770e869aa692e6694;hpb=3fa805685bb28d93961080ce157dbd1ee8578cc2;p=ghc-hetmet.git diff --git a/ghc/rts/Capability.h b/ghc/rts/Capability.h index e59f495..dd6a7be 100644 --- a/ghc/rts/Capability.h +++ b/ghc/rts/Capability.h @@ -29,23 +29,36 @@ extern Capability MainCapability; #endif extern void initCapabilities(void); -extern void grabCapability(Capability** cap); +extern void grabCapability(Capability** pCap); extern void releaseCapability(Capability* cap); +extern nat rts_n_free_capabilities; #if defined(RTS_SUPPORTS_THREADS) -extern nat rts_n_free_capabilities; /* total number of available capabilities */ +/* number of worker threads waiting for a return capability + */ +extern nat rts_n_waiting_workers; -static inline nat getFreeCapabilities() +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) { return rts_n_free_capabilities; } -static inline rtsBool noCapabilities() +static inline rtsBool noCapabilities (void) { return (rts_n_free_capabilities == 0); } -static inline rtsBool allFreeCapabilities() +static inline rtsBool allFreeCapabilities (void) { # if defined(SMP) return (rts_n_free_capabilities == RtsFlags.ParFlags.nNodes);