@@ -1117,30 +1117,28 @@ execAtomically time tid tlbl nextVid0 action0 k0 =
11171117
11181118 Retry ->
11191119 {-# SCC "execAtomically.go.Retry" #-}
1120- case ctl of
1121- AtomicallyFrame -> do
1122- -- Revert all the TVar writes
1123- ! _ <- traverse_ (\ (SomeTVar tvar) -> revertTVar tvar) written
1124- -- Return vars read, so the thread can block on them
1125- k0 $! StmTxBlocked $! Map. elems read
1126-
1127- BranchFrame (OrElseStmA b) k writtenOuter writtenOuterSeq createdOuterSeq ctl' ->
1128- {-# SCC "execAtomically.go.BranchFrame" #-} do
1129- -- Revert all the TVar writes within this orElse
1130- ! _ <- traverse_ (\ (SomeTVar tvar) -> revertTVar tvar) written
1131- -- Execute the orElse right hand with an empty written set
1132- let ctl'' = BranchFrame NoOpStmA k writtenOuter writtenOuterSeq createdOuterSeq ctl'
1133- go ctl'' read Map. empty [] [] nextVid b
1134-
1135- BranchFrame _ _k writtenOuter writtenOuterSeq createdOuterSeq ctl' ->
1136- {-# SCC "execAtomically.go.BranchFrame" #-} do
1137- -- Retry makes sense only within a OrElse context. If it is a branch other than
1138- -- OrElse left side, then bubble up the `retry` to the frame above.
1139- -- Revert all the TVar writes within this orElse branch
1120+ do
1121+ -- Always revert all the TVar writes for the retry
11401122 ! _ <- traverse_ (\ (SomeTVar tvar) -> revertTVar tvar) written
1141- -- Skip the continuation and propagate the retry into the outer frame
1142- -- using the written set for the outer frame
1143- go ctl' read writtenOuter writtenOuterSeq createdOuterSeq nextVid Retry
1123+ case ctl of
1124+ AtomicallyFrame -> do
1125+ -- Return vars read, so the thread can block on them
1126+ k0 $! StmTxBlocked $! Map. elems read
1127+
1128+ BranchFrame (OrElseStmA b) k writtenOuter writtenOuterSeq createdOuterSeq ctl' ->
1129+ {-# SCC "execAtomically.go.BranchFrame" #-} do
1130+ ! _ <- traverse_ (\ (SomeTVar tvar) -> revertTVar tvar) written
1131+ -- Execute the orElse right hand with an empty written set
1132+ let ctl'' = BranchFrame NoOpStmA k writtenOuter writtenOuterSeq createdOuterSeq ctl'
1133+ go ctl'' read Map. empty [] [] nextVid b
1134+
1135+ BranchFrame _ _k writtenOuter writtenOuterSeq createdOuterSeq ctl' ->
1136+ {-# SCC "execAtomically.go.BranchFrame" #-} do
1137+ -- Retry makes sense only within a OrElse context. If it is a branch other than
1138+ -- OrElse left side, then bubble up the `retry` to the frame above.
1139+ -- Skip the continuation and propagate the retry into the outer frame
1140+ -- using the written set for the outer frame
1141+ go ctl' read writtenOuter writtenOuterSeq createdOuterSeq nextVid Retry
11441142
11451143 OrElse a b k ->
11461144 {-# SCC "execAtomically.go.OrElse" #-} do
0 commit comments