X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2FSchedule.h;h=7760e364bd83aadf678018fab6567baf1b0e4765;hb=3d982281f91ee40e20d03bd5c9607f032d9215a6;hp=2412285d29bf780a4f1a66309528a98f950f1722;hpb=79957d77c1bff767f1041d3fabdeb94d92a52878;p=ghc-hetmet.git diff --git a/rts/Schedule.h b/rts/Schedule.h index 2412285..7760e36 100644 --- a/rts/Schedule.h +++ b/rts/Schedule.h @@ -86,15 +86,6 @@ extern StgTSO *blocked_queue_hd, *blocked_queue_tl; extern StgTSO *sleeping_queue; #endif -/* 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 - * set to rtsTrue just before we run some Haskell code. It is used - * to decide whether we should yield the Capability or not. - * Locks required : none (see scheduleCheckBlackHoles()). - */ -extern rtsBool blackholes_need_checking; - extern rtsBool heap_overflow; #if defined(THREADED_RTS) @@ -127,8 +118,10 @@ appendToRunQueue (Capability *cap, StgTSO *tso) ASSERT(tso->_link == END_TSO_QUEUE); if (cap->run_queue_hd == END_TSO_QUEUE) { cap->run_queue_hd = tso; + tso->block_info.prev = END_TSO_QUEUE; } else { setTSOLink(cap, cap->run_queue_tl, tso); + setTSOPrev(cap, tso, cap->run_queue_tl); } cap->run_queue_tl = tso; traceEventThreadRunnable (cap, tso); @@ -144,6 +137,10 @@ EXTERN_INLINE void pushOnRunQueue (Capability *cap, StgTSO *tso) { setTSOLink(cap, tso, cap->run_queue_hd); + tso->block_info.prev = END_TSO_QUEUE; + if (cap->run_queue_hd != END_TSO_QUEUE) { + setTSOPrev(cap, cap->run_queue_hd, tso); + } cap->run_queue_hd = tso; if (cap->run_queue_tl == END_TSO_QUEUE) { cap->run_queue_tl = tso; @@ -158,6 +155,9 @@ popRunQueue (Capability *cap) StgTSO *t = cap->run_queue_hd; ASSERT(t != END_TSO_QUEUE); cap->run_queue_hd = t->_link; + if (t->_link != END_TSO_QUEUE) { + t->_link->block_info.prev = END_TSO_QUEUE; + } t->_link = END_TSO_QUEUE; // no write barrier req'd if (cap->run_queue_hd == END_TSO_QUEUE) { cap->run_queue_tl = END_TSO_QUEUE; @@ -165,6 +165,8 @@ popRunQueue (Capability *cap) return t; } +extern void removeFromRunQueue (Capability *cap, StgTSO *tso); + /* Add a thread to the end of the blocked queue. */ #if !defined(THREADED_RTS)