X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2FSchedule.h;h=edba8f5f16e2e9b0ebdc1bd2e7ed7fb4e6bd8b50;hb=26f4bfc82f2b2359259578e9c54d476fc2de650f;hp=0db2b1ed84daa96fb075ec70a02ea207bb38a132;hpb=5d52d9b64c21dcf77849866584744722f8121389;p=ghc-hetmet.git diff --git a/rts/Schedule.h b/rts/Schedule.h index 0db2b1e..edba8f5 100644 --- a/rts/Schedule.h +++ b/rts/Schedule.h @@ -14,7 +14,7 @@ #include "Capability.h" #include "Trace.h" -BEGIN_RTS_PRIVATE +#include "BeginPrivate.h" /* initScheduler(), exitScheduler() * Called from STG : no @@ -44,7 +44,7 @@ void wakeUpRts(void); StgWord raiseExceptionHelper (StgRegTable *reg, StgTSO *tso, StgClosure *exception); /* findRetryFrameHelper */ -StgWord findRetryFrameHelper (StgTSO *tso); +StgWord findRetryFrameHelper (Capability *cap, StgTSO *tso); /* Entry point for a new worker */ void scheduleWorker (Capability *cap, Task *task); @@ -118,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); @@ -135,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; @@ -149,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; @@ -156,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) @@ -203,7 +214,7 @@ emptyThreadQueues(Capability *cap) #endif /* !IN_STG_CODE */ -END_RTS_PRIVATE +#include "EndPrivate.h" #endif /* SCHEDULE_H */