summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Gamari <ben@smart-cactus.org>2023-04-18 07:17:40 -0400
committerBen Gamari <ben@smart-cactus.org>2023-04-24 06:04:18 -0400
commit1a98c968c8b269bd66af3714efd29b579c691576 (patch)
tree3c6f23a45f6f6904aa64a374c1de813869a42a3e
parentb381a3b16a55face903f030dfd2ef1cfd753de01 (diff)
downloadhaskell-1a98c968c8b269bd66af3714efd29b579c691576.tar.gz
STM: relaxed
-rw-r--r--rts/STM.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/rts/STM.c b/rts/STM.c
index 8050913033..8cc54b7471 100644
--- a/rts/STM.c
+++ b/rts/STM.c
@@ -291,9 +291,11 @@ static StgClosure *lock_tvar(Capability *cap,
StgClosure *result;
TRACE("%p : lock_tvar(%p)", trec, s);
do {
+ StgInfoTable *info;
do {
- result = SEQ_CST_LOAD(&s->current_value);
- } while (GET_INFO(UNTAG_CLOSURE(result)) == &stg_TREC_HEADER_info);
+ result = ACQUIRE_LOAD(&s->current_value);
+ info = GET_INFO_RELAXED(UNTAG_CLOSURE(result));
+ } while (info == &stg_TREC_HEADER_info);
} while (cas((void *) &s->current_value,
(StgWord)result, (StgWord)trec) != (StgWord)result);