projects
/
ghc-hetmet.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
drop some debugging traces and use only one flag for new codegen
[ghc-hetmet.git]
/
rts
/
Capability.h
diff --git
a/rts/Capability.h
b/rts/Capability.h
index
dc0a28e
..
478b0f1
100644
(file)
--- a/
rts/Capability.h
+++ b/
rts/Capability.h
@@
-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;
// 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.
nat no; // capability number.
@@
-46,6
+50,9
@@
struct Capability_ {
// catching unsafe call-ins.
rtsBool in_haskell;
// 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
// 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
@@
-109,7
+116,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:
} // 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)
#if defined(THREADED_RTS)
@@
-137,10
+147,12
@@
struct Capability_ {
// Converts a *StgRegTable into a *Capability.
//
// Converts a *StgRegTable into a *Capability.
//
+#define OFFSET(s_type, field) ((size_t)&(((s_type*)0)->field))
+
INLINE_HEADER Capability *
regTableToCapability (StgRegTable *reg)
{
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.
}
// Initialise the available capabilities.
@@
-182,6
+194,8
@@
extern Capability *capabilities;
extern Capability *last_free_capability;
// GC indicator, in scope for the scheduler
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
extern volatile StgWord waiting_for_gc;
// Acquires a capability at a return point. If *cap is non-NULL, then
@@
-228,6
+242,7
@@
void wakeupThreadOnCapability (Capability *my_cap, Capability *other_cap,
// need to service some global event.
//
void prodOneCapability (void);
// need to service some global event.
//
void prodOneCapability (void);
+void prodCapability (Capability *cap, Task *task);
// Similar to prodOneCapability(), but prods all of them.
//
// Similar to prodOneCapability(), but prods all of them.
//
@@
-242,9
+257,13
@@
void shutdownCapability (Capability *cap, Task *task, rtsBool wait_foreign);
//
rtsBool tryGrabCapability (Capability *cap, Task *task);
//
rtsBool tryGrabCapability (Capability *cap, Task *task);
-// Try to steal a spark from other Capabilities
+// Try to find a spark to run
+//
+StgClosure *findSpark (Capability *cap);
+
+// True if any capabilities have sparks
//
//
-rtsBool stealWork (Capability *cap);
+rtsBool anySparks (void);
INLINE_HEADER rtsBool emptySparkPoolCap (Capability *cap);
INLINE_HEADER nat sparkPoolSizeCap (Capability *cap);
INLINE_HEADER rtsBool emptySparkPoolCap (Capability *cap);
INLINE_HEADER nat sparkPoolSizeCap (Capability *cap);
@@
-262,8
+281,8
@@
extern void grabCapability (Capability **pCap);
// cause all capabilities to context switch as soon as possible.
void setContextSwitches(void);
// cause all capabilities to context switch as soon as possible.
void setContextSwitches(void);
-// Free a capability on exit
-void freeCapability (Capability *cap);
+// Free all capabilities
+void freeCapabilities (void);
// FOr the GC:
void markSomeCapabilities (evac_fn evac, void *user, nat i0, nat delta,
// FOr the GC:
void markSomeCapabilities (evac_fn evac, void *user, nat i0, nat delta,