diff options
author | Ben Gamari <ben@smart-cactus.org> | 2023-04-18 07:17:40 -0400 |
---|---|---|
committer | Ben Gamari <ben@smart-cactus.org> | 2023-04-24 06:04:18 -0400 |
commit | 1a98c968c8b269bd66af3714efd29b579c691576 (patch) | |
tree | 3c6f23a45f6f6904aa64a374c1de813869a42a3e | |
parent | b381a3b16a55face903f030dfd2ef1cfd753de01 (diff) | |
download | haskell-1a98c968c8b269bd66af3714efd29b579c691576.tar.gz |
STM: relaxed
-rw-r--r-- | rts/STM.c | 6 |
1 files changed, 4 insertions, 2 deletions
@@ -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); |