// 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.
} // 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)
// 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.
//
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
//