X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2FSchedule.h;h=6ed759821290df32dd222a2ab9ad0fc91c6beb0d;hb=a200038f469418fef77d863dc3d1cd0125ec1e82;hp=32b7e59a5ee97e723494642ef367ac850380c4e5;hpb=04cddd339c000df6d02c90ce59dbffa58d2fe166;p=ghc-hetmet.git diff --git a/rts/Schedule.h b/rts/Schedule.h index 32b7e59..6ed7598 100644 --- a/rts/Schedule.h +++ b/rts/Schedule.h @@ -70,7 +70,9 @@ StgWord findRetryFrameHelper (StgTSO *tso); * Called from STG : NO * Locks assumed : none */ -void workerStart(Task *task); +#if defined(THREADED_RTS) +void OSThreadProcAttr workerStart(Task *task); +#endif #if defined(GRAN) void awaken_blocked_queue(StgBlockingQueueElement *q, StgClosure *node); @@ -133,11 +135,6 @@ extern StgTSO *RTS_VAR(sleeping_queue); #endif #endif -/* Linked list of all threads. - * Locks required : sched_mutex - */ -extern StgTSO *RTS_VAR(all_threads); - /* Set to rtsTrue if there are threads on the blackhole_queue, and * it is possible that one or more of them may be available to run. * This flag is set to rtsFalse after we've checked the queue, and @@ -159,6 +156,7 @@ void interruptStgRts (void); nat run_queue_len (void); void resurrectThreads (StgTSO *); +void performPendingThrowTos (StgTSO *); void printAllThreads(void); @@ -241,16 +239,21 @@ appendToBlockedQueue(StgTSO *tso) #endif #if defined(THREADED_RTS) +// Assumes: my_cap is owned by the current Task. We hold +// other_cap->lock, but we do not necessarily own other_cap; another +// Task may be running on it. INLINE_HEADER void -appendToWakeupQueue (Capability *cap, StgTSO *tso) +appendToWakeupQueue (Capability *my_cap, Capability *other_cap, StgTSO *tso) { ASSERT(tso->_link == END_TSO_QUEUE); - if (cap->wakeup_queue_hd == END_TSO_QUEUE) { - cap->wakeup_queue_hd = tso; + if (other_cap->wakeup_queue_hd == END_TSO_QUEUE) { + other_cap->wakeup_queue_hd = tso; } else { - setTSOLink(cap, cap->wakeup_queue_tl, tso); + // my_cap is passed to setTSOLink() because it may need to + // write to the mutable list. + setTSOLink(my_cap, other_cap->wakeup_queue_tl, tso); } - cap->wakeup_queue_tl = tso; + other_cap->wakeup_queue_tl = tso; } #endif