X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FCapability.h;h=cb0b09bd7cfca4db924c51cf122ef0e941433e8e;hb=286a25bb4e6c5baf8900874300dc095705d84918;hp=35f1ad481fc8cabcc33b61002413938c299e7143;hpb=3b9c5eb29bbb47a5733e37c9940789342d9d6f49;p=ghc-hetmet.git diff --git a/ghc/rts/Capability.h b/ghc/rts/Capability.h index 35f1ad4..cb0b09b 100644 --- a/ghc/rts/Capability.h +++ b/ghc/rts/Capability.h @@ -24,28 +24,46 @@ #include "RtsFlags.h" /* ToDo: assume that RtsFlags.h has been included at usage sites of Capability.h? */ -extern void initCapability(Capability* cap); -#if defined(SMP) -extern nat rts_n_free_capabilities; /* total number of available capabilities */ +#if !defined(SMP) +extern Capability MainCapability; +#endif -static inline nat getFreeCapabilities() +extern void initCapabilities(void); +extern void grabCapability(Capability** pCap); +extern void releaseCapability(Capability* cap); + +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 */ + +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 } -extern void initCapabilities(nat n); -extern void grabCapability(Capability** cap); -extern void releaseCapability(Capability** cap); -#endif /* SMP */ +#endif /* RTS_SUPPORTS_THREADS */ #endif /* __CAPABILITY_H__ */