X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2FCapability.h;h=59458951ebfc858c39f28bbfa415fb0727aa988c;hb=cf9650f2a1690c04051c716124bb0350adc74ae7;hp=71c0ff6c1a3b25757177f183df8645583710ce83;hpb=f86e7206ea94b48b94fb61007a1c5d55b8c60f45;p=ghc-hetmet.git diff --git a/rts/Capability.h b/rts/Capability.h index 71c0ff6..5945895 100644 --- a/rts/Capability.h +++ b/rts/Capability.h @@ -23,6 +23,7 @@ #ifndef CAPABILITY_H #define CAPABILITY_H +#include "RtsTypes.h" #include "RtsFlags.h" #include "Task.h" @@ -66,6 +67,10 @@ struct Capability_ { // each GC. bdescr **mut_lists; + // Context switch flag. We used to have one global flag, now one + // per capability. Locks required : none (conflicts are harmless) + int context_switch; + #if defined(THREADED_RTS) // Worker Tasks waiting in the wings. Singly-linked. Task *spare_workers; @@ -94,6 +99,9 @@ struct Capability_ { StgTRecChunk *free_trec_chunks; StgTRecHeader *free_trec_headers; nat transaction_tokens; + + SparkPool *sparks; + }; // typedef Capability, defined in RtsAPI.h @@ -162,6 +170,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 +210,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. @@ -232,12 +240,16 @@ extern void grabCapability (Capability **pCap); #endif /* !THREADED_RTS */ +// cause all capabilities to context switch as soon as possible. +void setContextSwitches(void); + // 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 @@ -248,6 +260,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;