X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2FCapability.h;h=b6f6440cb8692ccccba63e56c72e56bcd7397075;hb=022ee7c728822c4dd5be226f75e44557b4a3d9a1;hp=89545780a4d84718b87ca3e0026980b7beafaa98;hpb=1d14a6cd5f563507135d450a63cf2bd7e870fe55;p=ghc-hetmet.git diff --git a/rts/Capability.h b/rts/Capability.h index 8954578..b6f6440 100644 --- a/rts/Capability.h +++ b/rts/Capability.h @@ -32,11 +32,7 @@ struct Capability_ { // code. During STG execution, the BaseReg register always points // to the StgRegTable of the current Capability (&cap->r). StgFunTable f; - 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. + StgRegTable r; nat no; // capability number. @@ -50,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 @@ -191,6 +190,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 @@ -237,6 +238,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. //