Skip to content

Commit 2c50afe

Browse files
committed
io-sim-por: make execAtomically' more strict
1 parent 5b9f182 commit 2c50afe

File tree

1 file changed

+24
-23
lines changed

1 file changed

+24
-23
lines changed

io-sim/src/Control/Monad/IOSimPOR/Internal.hs

Lines changed: 24 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1055,20 +1055,19 @@ execAtomically time tid tlbl nextVid0 action0 k0 =
10551055
-> TVarId -- var fresh name supply
10561056
-> StmA s b
10571057
-> ST s (SimTrace c)
1058-
go ctl !read !written writtenSeq createdSeq !nextVid action = assert localInvariant $
1058+
go !ctl !read !written !writtenSeq !createdSeq !nextVid action = assert localInvariant $
10591059
case action of
10601060
ReturnStm x ->
10611061
{-# SCC "execAtomically.go.ReturnStm" #-}
10621062
case ctl of
10631063
AtomicallyFrame -> do
10641064
-- Trace each created TVar
1065-
ds <- traverse (\(SomeTVar tvar) -> traceTVarST tvar True
1066-
) createdSeq
1065+
!ds <- traverse (\(SomeTVar tvar) -> traceTVarST tvar True) createdSeq
10671066
-- Trace & commit each TVar
1068-
ds' <- Map.elems <$> traverse
1067+
!ds' <- Map.elems <$> traverse
10691068
(\(SomeTVar tvar) -> do
10701069
tr <- traceTVarST tvar False
1071-
commitTVar tvar
1070+
!_ <- commitTVar tvar
10721071
-- Also assert the data invariant that outside a tx
10731072
-- the undo stack is empty:
10741073
undos <- readTVarUndos tvar
@@ -1088,8 +1087,8 @@ execAtomically time tid tlbl nextVid0 action0 k0 =
10881087
OrElseLeftFrame _b k writtenOuter writtenOuterSeq createdOuterSeq ctl' -> do
10891088
-- Commit the TVars written in this sub-transaction that are also
10901089
-- in the written set of the outer transaction
1091-
traverse_ (\(SomeTVar tvar) -> commitTVar tvar)
1092-
(Map.intersection written writtenOuter)
1090+
!_ <- traverse_ (\(SomeTVar tvar) -> commitTVar tvar)
1091+
(Map.intersection written writtenOuter)
10931092
-- Merge the written set of the inner with the outer
10941093
let written' = Map.union written writtenOuter
10951094
writtenSeq' = filter (\(SomeTVar tvar) ->
@@ -1102,8 +1101,8 @@ execAtomically time tid tlbl nextVid0 action0 k0 =
11021101
OrElseRightFrame k writtenOuter writtenOuterSeq createdOuterSeq ctl' -> do
11031102
-- Commit the TVars written in this sub-transaction that are also
11041103
-- in the written set of the outer transaction
1105-
traverse_ (\(SomeTVar tvar) -> commitTVar tvar)
1106-
(Map.intersection written writtenOuter)
1104+
!_ <- traverse_ (\(SomeTVar tvar) -> commitTVar tvar)
1105+
(Map.intersection written writtenOuter)
11071106
-- Merge the written set of the inner with the outer
11081107
let written' = Map.union written writtenOuter
11091108
writtenSeq' = filter (\(SomeTVar tvar) ->
@@ -1117,30 +1116,30 @@ execAtomically time tid tlbl nextVid0 action0 k0 =
11171116
ThrowStm e ->
11181117
{-# SCC "execAtomically.go.ThrowStm" #-} do
11191118
-- Revert all the TVar writes
1120-
traverse_ (\(SomeTVar tvar) -> revertTVar tvar) written
1119+
!_ <- traverse_ (\(SomeTVar tvar) -> revertTVar tvar) written
11211120
k0 $ StmTxAborted (Map.elems read) (toException e)
11221121

11231122
Retry ->
11241123
{-# SCC "execAtomically.go.Retry" #-}
11251124
case ctl of
11261125
AtomicallyFrame -> do
11271126
-- Revert all the TVar writes
1128-
traverse_ (\(SomeTVar tvar) -> revertTVar tvar) written
1127+
!_ <- traverse_ (\(SomeTVar tvar) -> revertTVar tvar) written
11291128
-- Return vars read, so the thread can block on them
1130-
k0 $ StmTxBlocked (Map.elems read)
1129+
k0 $! StmTxBlocked $! Map.elems read
11311130

11321131
OrElseLeftFrame b k writtenOuter writtenOuterSeq createdOuterSeq ctl' ->
11331132
{-# SCC "execAtomically.go.OrElseLeftFrame" #-} do
11341133
-- Revert all the TVar writes within this orElse
1135-
traverse_ (\(SomeTVar tvar) -> revertTVar tvar) written
1134+
!_ <- traverse_ (\(SomeTVar tvar) -> revertTVar tvar) written
11361135
-- Execute the orElse right hand with an empty written set
11371136
let ctl'' = OrElseRightFrame k writtenOuter writtenOuterSeq createdOuterSeq ctl'
11381137
go ctl'' read Map.empty [] [] nextVid b
11391138

11401139
OrElseRightFrame _k writtenOuter writtenOuterSeq createdOuterSeq ctl' ->
11411140
{-# SCC "execAtomically.go.OrElseRightFrame" #-} do
11421141
-- Revert all the TVar writes within this orElse branch
1143-
traverse_ (\(SomeTVar tvar) -> revertTVar tvar) written
1142+
!_ <- traverse_ (\(SomeTVar tvar) -> revertTVar tvar) written
11441143
-- Skip the continuation and propagate the retry into the outer frame
11451144
-- using the written set for the outer frame
11461145
go ctl' read writtenOuter writtenOuterSeq createdOuterSeq nextVid Retry
@@ -1153,21 +1152,21 @@ execAtomically time tid tlbl nextVid0 action0 k0 =
11531152

11541153
NewTVar !mbLabel x k ->
11551154
{-# SCC "execAtomically.go.NewTVar" #-} do
1156-
v <- execNewTVar nextVid mbLabel x
1155+
!v <- execNewTVar nextVid mbLabel x
11571156
-- record a write to the TVar so we know to update its VClock
11581157
let written' = Map.insert (tvarId v) (SomeTVar v) written
11591158
-- save the value: it will be committed or reverted
1160-
saveTVar v
1159+
!_ <- saveTVar v
11611160
go ctl read written' writtenSeq (SomeTVar v : createdSeq) (succ nextVid) (k v)
11621161

11631162
LabelTVar !label tvar k ->
11641163
{-# SCC "execAtomically.go.LabelTVar" #-} do
1165-
writeSTRef (tvarLabel tvar) $! (Just label)
1164+
!_ <- writeSTRef (tvarLabel tvar) $! (Just label)
11661165
go ctl read written writtenSeq createdSeq nextVid k
11671166

11681167
TraceTVar tvar f k ->
11691168
{-# SCC "execAtomically.go.TraceTVar" #-} do
1170-
writeSTRef (tvarTrace tvar) (Just f)
1169+
!_ <- writeSTRef (tvarTrace tvar) (Just f)
11711170
go ctl read written writtenSeq createdSeq nextVid k
11721171

11731172
ReadTVar v k
@@ -1184,10 +1183,12 @@ execAtomically time tid tlbl nextVid0 action0 k0 =
11841183
WriteTVar v x k
11851184
| tvarId v `Map.member` written ->
11861185
{-# SCC "execAtomically.go.WriteTVar" #-} do
1186+
!_ <- execWriteTVar v x
11871187
go ctl read written writtenSeq createdSeq nextVid k
11881188
| otherwise ->
11891189
{-# SCC "execAtomically.go.WriteTVar" #-} do
1190-
execWriteTVar v x
1190+
!_ <- saveTVar v
1191+
!_ <- execWriteTVar v x
11911192
let written' = Map.insert (tvarId v) (SomeTVar v) written
11921193
go ctl read written' (SomeTVar v : writtenSeq) createdSeq nextVid k
11931194

@@ -1220,18 +1221,18 @@ execAtomically' = go Map.empty
12201221
-> ST s [SomeTVar s]
12211222
go !written action = case action of
12221223
ReturnStm () -> do
1223-
traverse_ (\(SomeTVar tvar) -> commitTVar tvar) written
1224+
!_ <- traverse_ (\(SomeTVar tvar) -> commitTVar tvar) written
12241225
return (Map.elems written)
12251226
ReadTVar v k -> do
12261227
x <- execReadTVar v
12271228
go written (k x)
12281229
WriteTVar v x k
12291230
| tvarId v `Map.member` written -> do
1230-
execWriteTVar v x
1231+
!_ <- execWriteTVar v x
12311232
go written k
12321233
| otherwise -> do
1233-
saveTVar v
1234-
execWriteTVar v x
1234+
!_ <- saveTVar v
1235+
!_ <- execWriteTVar v x
12351236
let written' = Map.insert (tvarId v) (SomeTVar v) written
12361237
go written' k
12371238
_ -> error "execAtomically': only for special case of reads and writes"

0 commit comments

Comments
 (0)