X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2FCapability.h;h=ba0695c8ee23ac7590626d77e81ed6997db3b8d8;hb=164be7854f6de07bb4bc15f60af727ddb562cde7;hp=07b8838221e88e3e00d4cd1ccea1ab310ba1bfd1;hpb=c039455d1b81687d395617a43aeea67c31b34b9f;p=ghc-hetmet.git diff --git a/rts/Capability.h b/rts/Capability.h index 07b8838..ba0695c 100644 --- a/rts/Capability.h +++ b/rts/Capability.h @@ -46,6 +46,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 @@ -143,7 +146,7 @@ struct Capability_ { INLINE_HEADER Capability * regTableToCapability (StgRegTable *reg) { - return (Capability *)((void *)((unsigned char*)reg - sizeof(StgFunTable))); + return (Capability *)((void *)((unsigned char*)reg - FIELD_OFFSET(Capability,r))); } // Initialise the available capabilities. @@ -185,6 +188,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 @@ -231,6 +236,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. // @@ -245,9 +251,9 @@ 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 *stealWork (Capability *cap); +StgClosure *findSpark (Capability *cap); // True if any capabilities have sparks //