X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FCapability.h;h=cb0b09bd7cfca4db924c51cf122ef0e941433e8e;hb=c4d85183321cb88070d5e6a76dbc4594ebaf2f48;hp=cecbc8b98db75430a9284f2be9b0110b261951f6;hpb=199b5c0766a2c7888544a970d35ba4d8fd889a07;p=ghc-hetmet.git diff --git a/ghc/rts/Capability.h b/ghc/rts/Capability.h index cecbc8b..cb0b09b 100644 --- a/ghc/rts/Capability.h +++ b/ghc/rts/Capability.h @@ -29,27 +29,41 @@ 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 to do good work within + the RTS. Used by Task.c (only) to determine whether or not + new worker threads needs to be created (when an external call + is made). + */ +extern nat rts_n_waiting_workers; /* used by Task.c to determine */ -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 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__ */