summaryrefslogtreecommitdiff
path: root/rts/Schedule.c
diff options
context:
space:
mode:
Diffstat (limited to 'rts/Schedule.c')
-rw-r--r--rts/Schedule.c55
1 files changed, 55 insertions, 0 deletions
diff --git a/rts/Schedule.c b/rts/Schedule.c
index bc0e7d3acf..028578d6dc 100644
--- a/rts/Schedule.c
+++ b/rts/Schedule.c
@@ -2915,6 +2915,61 @@ deleteThread_(StgTSO *tso)
}
#endif
+/*
+ * Run queue manipulation
+ */
+
+void
+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;
+ cap->n_run_queue++;
+}
+
+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;
+ }
+ cap->n_run_queue++;
+}
+
+StgTSO *popRunQueue (Capability *cap)
+{
+ ASSERT(cap->n_run_queue > 0);
+ StgTSO *t = cap->run_queue_hd;
+ ASSERT(t != END_TSO_QUEUE);
+ cap->run_queue_hd = t->_link;
+
+ StgTSO *link = RELAXED_LOAD(&t->_link);
+ if (link != END_TSO_QUEUE) {
+ link->block_info.prev = END_TSO_QUEUE;
+ }
+ RELAXED_STORE(&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;
+ }
+ cap->n_run_queue--;
+ return t;
+}
+
+
/* -----------------------------------------------------------------------------
raiseExceptionHelper