X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FCapability.h;h=cb0b09bd7cfca4db924c51cf122ef0e941433e8e;hb=9bffc64eff34148e67a28834aa6597c6027f28d3;hp=e59f495874ae3e60e6e57ea770e869aa692e6694;hpb=3fa805685bb28d93961080ce157dbd1ee8578cc2;p=ghc-hetmet.git diff --git a/ghc/rts/Capability.h b/ghc/rts/Capability.h index e59f495..cb0b09b 100644 --- a/ghc/rts/Capability.h +++ b/ghc/rts/Capability.h @@ -29,23 +29,33 @@ 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 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 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);