X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2FCapability.h;h=94306eb6c008128a16f2704ae0a9041d49ffe211;hb=d572aed64d9c40dcc38a49b09d18f301555e4efb;hp=dedd6351b693bebc23ba0f0bac3584e29f2f17d5;hpb=ed12b7043fa98928f75c289a756fbcef546315f8;p=ghc-hetmet.git diff --git a/rts/Capability.h b/rts/Capability.h index dedd635..94306eb 100644 --- a/rts/Capability.h +++ b/rts/Capability.h @@ -162,6 +162,9 @@ extern Capability *capabilities; // extern Capability *last_free_capability; +// GC indicator, in scope for the scheduler +extern volatile StgWord waiting_for_gc; + // Acquires a capability at a return point. If *cap is non-NULL, then // this is taken as a preference for the Capability we wish to // acquire. @@ -199,11 +202,8 @@ void waitForCapability (Task *task, Mutex *mutex, Capability **pCap); // Wakes up a thread on a Capability (probably a different Capability // from the one held by the current Task). // -void wakeupThreadOnCapability (Capability *cap, StgTSO *tso); -void wakeupThreadOnCapability_lock (Capability *cap, StgTSO *tso); - -void migrateThreadToCapability (Capability *cap, StgTSO *tso); -void migrateThreadToCapability_lock (Capability *cap, StgTSO *tso); +void wakeupThreadOnCapability (Capability *my_cap, Capability *other_cap, + StgTSO *tso); // Wakes up a worker thread on just one Capability, used when we // need to service some global event. @@ -217,7 +217,7 @@ void prodAllCapabilities (void); // Waits for a capability to drain of runnable threads and workers, // and then acquires it. Used at shutdown time. // -void shutdownCapability (Capability *cap, Task *task); +void shutdownCapability (Capability *cap, Task *task, rtsBool wait_foreign); // Attempt to gain control of a Capability if it is free. // @@ -235,6 +235,11 @@ extern void grabCapability (Capability **pCap); // Free a capability on exit void freeCapability (Capability *cap); +// FOr the GC: +void markSomeCapabilities (evac_fn evac, void *user, nat i0, nat delta); +void markCapabilities (evac_fn evac, void *user); +void traverseSparkQueues (evac_fn evac, void *user); + /* ----------------------------------------------------------------------------- * INLINE functions... private below here * -------------------------------------------------------------------------- */ @@ -244,6 +249,8 @@ recordMutableCap (StgClosure *p, Capability *cap, nat gen) { bdescr *bd; + // We must own this Capability in order to modify its mutable list. + ASSERT(cap->running_task == myTask()); bd = cap->mut_lists[gen]; if (bd->free >= bd->start + BLOCK_SIZE_W) { bdescr *new_bd;