From 8a317b223ac681f99e75f9a4a89380c92d283049 Mon Sep 17 00:00:00 2001 From: Simon Marlow Date: Wed, 7 Jan 2009 11:20:26 +0000 Subject: [PATCH] putMVar and takeMVar: add write_barrier() to fix race with throwTo --- rts/PrimOps.cmm | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/rts/PrimOps.cmm b/rts/PrimOps.cmm index 40948a3..dc60ff2 100644 --- a/rts/PrimOps.cmm +++ b/rts/PrimOps.cmm @@ -1651,8 +1651,11 @@ takeMVarzh_fast CurrentTSO) []; } StgTSO__link(CurrentTSO) = stg_END_TSO_QUEUE_closure; - StgTSO_why_blocked(CurrentTSO) = BlockedOnMVar::I16; StgTSO_block_info(CurrentTSO) = mvar; + // write barrier for throwTo(), which looks at block_info + // if why_blocked==BlockedOnMVar. + prim %write_barrier() []; + StgTSO_why_blocked(CurrentTSO) = BlockedOnMVar::I16; StgMVar_tail(mvar) = CurrentTSO; R1 = mvar; @@ -1808,8 +1811,11 @@ putMVarzh_fast CurrentTSO) []; } StgTSO__link(CurrentTSO) = stg_END_TSO_QUEUE_closure; - StgTSO_why_blocked(CurrentTSO) = BlockedOnMVar::I16; StgTSO_block_info(CurrentTSO) = mvar; + // write barrier for throwTo(), which looks at block_info + // if why_blocked==BlockedOnMVar. + prim %write_barrier() []; + StgTSO_why_blocked(CurrentTSO) = BlockedOnMVar::I16; StgMVar_tail(mvar) = CurrentTSO; R1 = mvar; -- 1.7.10.4