we shouldn't update topBound in discardSparks()
[ghc-hetmet.git] / rts / Capability.h
index 869fdc3..8954578 100644 (file)
@@ -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.
 
@@ -109,7 +113,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 +144,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.
@@ -242,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
 //