X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2FCapability.h;h=478b0f1312e8a9e4aca1bdf6cf9b06041d8c1b8f;hb=5892af0e08fdb890b5a0b9a64346d9f7773a6ed8;hp=9446a7e7794b06526f898675d8938caacddc84c3;hpb=b7ea7671c442a0223f34593dc8a1182b15dde0bf;p=ghc-hetmet.git diff --git a/rts/Capability.h b/rts/Capability.h index 9446a7e..478b0f1 100644 --- a/rts/Capability.h +++ b/rts/Capability.h @@ -32,7 +32,11 @@ struct Capability_ { // code. During STG execution, the BaseReg register always points // to the StgRegTable of the current Capability (&cap->r). StgFunTable f; - StgRegTable r; + StgRegTable r GNU_ATTRIBUTE(packed); + // packed eliminates any padding between f and r. Not strictly + // necessary, but it means the negative offsets for accessing + // the fields of f when we are in STG code are as small as + // possible. nat no; // capability number. @@ -46,6 +50,9 @@ struct Capability_ { // catching unsafe call-ins. rtsBool in_haskell; + // true if this Capability is currently in the GC + rtsBool in_gc; + // The run queue. The Task owning this Capability has exclusive // access to its run queue, so can wake up threads without // taking a lock, and the common path through the scheduler is @@ -109,7 +116,10 @@ struct Capability_ { } // 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: - ATTRIBUTE_ALIGNED(64); +#ifndef mingw32_HOST_OS + ATTRIBUTE_ALIGNED(64) +#endif + ; #if defined(THREADED_RTS) @@ -137,10 +147,12 @@ struct Capability_ { // Converts a *StgRegTable into a *Capability. // +#define OFFSET(s_type, field) ((size_t)&(((s_type*)0)->field)) + INLINE_HEADER Capability * regTableToCapability (StgRegTable *reg) { - return (Capability *)((void *)((unsigned char*)reg - sizeof(StgFunTable))); + return (Capability *)((void *)((unsigned char*)reg - OFFSET(Capability,r))); } // Initialise the available capabilities. @@ -182,6 +194,8 @@ extern Capability *capabilities; extern Capability *last_free_capability; // GC indicator, in scope for the scheduler +#define PENDING_GC_SEQ 1 +#define PENDING_GC_PAR 2 extern volatile StgWord waiting_for_gc; // Acquires a capability at a return point. If *cap is non-NULL, then @@ -228,6 +242,7 @@ void wakeupThreadOnCapability (Capability *my_cap, Capability *other_cap, // need to service some global event. // void prodOneCapability (void); +void prodCapability (Capability *cap, Task *task); // Similar to prodOneCapability(), but prods all of them. // @@ -242,9 +257,13 @@ void shutdownCapability (Capability *cap, Task *task, rtsBool wait_foreign); // rtsBool tryGrabCapability (Capability *cap, Task *task); -// Try to steal a spark from other Capabilities +// Try to find a spark to run +// +StgClosure *findSpark (Capability *cap); + +// True if any capabilities have sparks // -rtsBool stealWork (Capability *cap); +rtsBool anySparks (void); INLINE_HEADER rtsBool emptySparkPoolCap (Capability *cap); INLINE_HEADER nat sparkPoolSizeCap (Capability *cap);