X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2FCapability.h;h=db9e1e3afd07941de7d451240f546fef99805e6c;hb=63179a7b10069d8f69f5bceef27008c9c7fb0aa8;hp=70d9ee9e8de418b4f9d3e1a6b17b47c025c00e74;hpb=8f52645bd99ee3e636a34826c0cbfc5939920da1;p=ghc-hetmet.git diff --git a/rts/Capability.h b/rts/Capability.h index 70d9ee9..db9e1e3 100644 --- a/rts/Capability.h +++ b/rts/Capability.h @@ -25,6 +25,7 @@ #include "RtsFlags.h" #include "Task.h" +#include "Sparks.h" struct Capability_ { // State required by the STG virtual machine when running Haskell @@ -90,6 +91,13 @@ struct Capability_ { // woken up by another Capability. StgTSO *wakeup_queue_hd; StgTSO *wakeup_queue_tl; + + SparkPool *sparks; + + // Stats on spark creation/conversion + nat sparks_created; + nat sparks_converted; + nat sparks_pruned; #endif // Per-capability STM-related data @@ -98,7 +106,13 @@ struct Capability_ { StgTRecChunk *free_trec_chunks; StgTRecHeader *free_trec_headers; nat transaction_tokens; -}; // typedef Capability, defined in RtsAPI.h +} // typedef Capability is defined in RtsAPI.h + // Capabilities are stored in an array, so make sure that adjacent + // Capabilities don't share any cache-lines: +#ifndef mingw32_HOST_OS + ATTRIBUTE_ALIGNED(64) +#endif + ; #if defined(THREADED_RTS) @@ -143,12 +157,16 @@ void initCapabilities (void); // ASSUMES: cap->running_task is the current Task. // #if defined(THREADED_RTS) -void releaseCapability (Capability* cap); -void releaseCapability_ (Capability* cap); // assumes cap->lock is held +void releaseCapability (Capability* cap); +void releaseAndWakeupCapability (Capability* cap); +void releaseCapability_ (Capability* cap, rtsBool always_wakeup); +// assumes cap->lock is held #else // releaseCapability() is empty in non-threaded RTS INLINE_HEADER void releaseCapability (Capability* cap STG_UNUSED) {}; -INLINE_HEADER void releaseCapability_ (Capability* cap STG_UNUSED) {}; +INLINE_HEADER void releaseAndWakeupCapability (Capability* cap STG_UNUSED) {}; +INLINE_HEADER void releaseCapability_ (Capability* cap STG_UNUSED, + rtsBool always_wakeup STG_UNUSED) {}; #endif #if !IN_STG_CODE @@ -227,6 +245,18 @@ void shutdownCapability (Capability *cap, Task *task, rtsBool wait_foreign); // rtsBool tryGrabCapability (Capability *cap, Task *task); +// Try to find a spark to run +// +StgClosure *findSpark (Capability *cap); + +// True if any capabilities have sparks +// +rtsBool anySparks (void); + +INLINE_HEADER rtsBool emptySparkPoolCap (Capability *cap); +INLINE_HEADER nat sparkPoolSizeCap (Capability *cap); +INLINE_HEADER void discardSparksCap (Capability *cap); + #else // !THREADED_RTS // Grab a capability. (Only in the non-threaded RTS; in the threaded @@ -239,11 +269,12 @@ extern void grabCapability (Capability **pCap); // cause all capabilities to context switch as soon as possible. void setContextSwitches(void); -// Free a capability on exit -void freeCapability (Capability *cap); +// Free all capabilities +void freeCapabilities (void); // FOr the GC: -void markSomeCapabilities (evac_fn evac, void *user, nat i0, nat delta); +void markSomeCapabilities (evac_fn evac, void *user, nat i0, nat delta, + rtsBool prune_sparks); void markCapabilities (evac_fn evac, void *user); void traverseSparkQueues (evac_fn evac, void *user); @@ -269,4 +300,18 @@ recordMutableCap (StgClosure *p, Capability *cap, nat gen) *bd->free++ = (StgWord)p; } +#if defined(THREADED_RTS) +INLINE_HEADER rtsBool +emptySparkPoolCap (Capability *cap) +{ return looksEmpty(cap->sparks); } + +INLINE_HEADER nat +sparkPoolSizeCap (Capability *cap) +{ return sparkPoolSize(cap->sparks); } + +INLINE_HEADER void +discardSparksCap (Capability *cap) +{ return discardSparks(cap->sparks); } +#endif + #endif /* CAPABILITY_H */