diff options
author | Ben Gamari <ben@smart-cactus.org> | 2019-09-30 16:04:52 +0000 |
---|---|---|
committer | Ben Gamari <ben@smart-cactus.org> | 2020-11-24 12:03:02 -0500 |
commit | 3e36d9eece985ae6d7e22785b97b56c340621e68 (patch) | |
tree | 5356eb6ece1ecaa7a104ecdd20e5d28985837d2f /rts | |
parent | 1727bc57fefe2965b2938c6dbd4d56dbdf8431d8 (diff) | |
download | haskell-3e36d9eece985ae6d7e22785b97b56c340621e68.tar.gz |
rts/Schedule: Eliminate data races in run queue management
Diffstat (limited to 'rts')
-rw-r--r-- | rts/Schedule.h | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/rts/Schedule.h b/rts/Schedule.h index a550a6763a..4c692842e7 100644 --- a/rts/Schedule.h +++ b/rts/Schedule.h @@ -184,10 +184,13 @@ 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; + + StgTSO *link = RELAXED_LOAD(&t->_link); + if (link != END_TSO_QUEUE) { + link->block_info.prev = END_TSO_QUEUE; } - t->_link = END_TSO_QUEUE; // no write barrier req'd + 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; } @@ -230,12 +233,18 @@ emptyQueue (StgTSO *q) INLINE_HEADER bool emptyRunQueue(Capability *cap) { + // Can only be called by the task owning the capability. + TSAN_ANNOTATE_BENIGN_RACE(&cap->n_run_queue, "emptyRunQueue"); return cap->n_run_queue == 0; } INLINE_HEADER void truncateRunQueue(Capability *cap) { + // Can only be called by the task owning the capability. + TSAN_ANNOTATE_BENIGN_RACE(&cap->run_queue_hd, "truncateRunQueue"); + TSAN_ANNOTATE_BENIGN_RACE(&cap->run_queue_tl, "truncateRunQueue"); + TSAN_ANNOTATE_BENIGN_RACE(&cap->n_run_queue, "truncateRunQueue"); cap->run_queue_hd = END_TSO_QUEUE; cap->run_queue_tl = END_TSO_QUEUE; cap->n_run_queue = 0; |