// 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.
// 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
// 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 - OFFSET(Capability,r)));
+ return (Capability *)((void *)((unsigned char*)reg - FIELD_OFFSET(Capability,r)));
}
// Initialise the available 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
// need to service some global event.
//
void prodOneCapability (void);
+void prodCapability (Capability *cap, Task *task);
// Similar to prodOneCapability(), but prods all of them.
//