X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;ds=sidebyside;f=ghc%2Frts%2FCapability.h;h=ede787b5626a509117bf96077184c73c9b19ca44;hb=1f1e68b21b14335932d3ffd06ba3e335515ae384;hp=cecbc8b98db75430a9284f2be9b0110b261951f6;hpb=199b5c0766a2c7888544a970d35ba4d8fd889a07;p=ghc-hetmet.git diff --git a/ghc/rts/Capability.h b/ghc/rts/Capability.h index cecbc8b..ede787b 100644 --- a/ghc/rts/Capability.h +++ b/ghc/rts/Capability.h @@ -29,27 +29,45 @@ extern Capability MainCapability; #endif extern void initCapabilities(void); -extern void grabCapability(Capability** cap); +extern void grabCapability(Capability** pCap); extern void releaseCapability(Capability* cap); -#if defined(SMP) -extern nat rts_n_free_capabilities; /* 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; -static inline nat getFreeCapabilities() +extern void grabReturnCapability(Mutex* pMutex, Capability** pCap); +extern void yieldToReturningWorker(Mutex* pMutex, Capability** pCap, Condition *pThreadCond); +extern void waitForWorkCapability(Mutex* pMutex, Capability** pCap, Condition *pThreadCond); +extern void passCapability(Mutex* pMutex, Capability* cap, Condition *pTargetThreadCond); +extern void passCapabilityToWorker(Mutex* pMutex, Capability* cap); + +static inline rtsBool needToYieldToReturningWorker(void) +{ + return rts_n_waiting_workers > 0; +} + +static inline nat getFreeCapabilities (void) { return rts_n_free_capabilities; } -static inline rtsBool noFreeCapabilities() +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); +# else + return (rts_n_free_capabilities == 1); +# endif } -#endif /* SMP */ +#endif /* RTS_SUPPORTS_THREADS */ #endif /* __CAPABILITY_H__ */