@@ -1055,20 +1055,19 @@ execAtomically time tid tlbl nextVid0 action0 k0 =
1055
1055
-> TVarId -- var fresh name supply
1056
1056
-> StmA s b
1057
1057
-> 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 $
1059
1059
case action of
1060
1060
ReturnStm x ->
1061
1061
{-# SCC "execAtomically.go.ReturnStm" #-}
1062
1062
case ctl of
1063
1063
AtomicallyFrame -> do
1064
1064
-- Trace each created TVar
1065
- ds <- traverse (\ (SomeTVar tvar) -> traceTVarST tvar True
1066
- ) createdSeq
1065
+ ! ds <- traverse (\ (SomeTVar tvar) -> traceTVarST tvar True ) createdSeq
1067
1066
-- Trace & commit each TVar
1068
- ds' <- Map. elems <$> traverse
1067
+ ! ds' <- Map. elems <$> traverse
1069
1068
(\ (SomeTVar tvar) -> do
1070
1069
tr <- traceTVarST tvar False
1071
- commitTVar tvar
1070
+ ! _ <- commitTVar tvar
1072
1071
-- Also assert the data invariant that outside a tx
1073
1072
-- the undo stack is empty:
1074
1073
undos <- readTVarUndos tvar
@@ -1088,8 +1087,8 @@ execAtomically time tid tlbl nextVid0 action0 k0 =
1088
1087
OrElseLeftFrame _b k writtenOuter writtenOuterSeq createdOuterSeq ctl' -> do
1089
1088
-- Commit the TVars written in this sub-transaction that are also
1090
1089
-- 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)
1093
1092
-- Merge the written set of the inner with the outer
1094
1093
let written' = Map. union written writtenOuter
1095
1094
writtenSeq' = filter (\ (SomeTVar tvar) ->
@@ -1102,8 +1101,8 @@ execAtomically time tid tlbl nextVid0 action0 k0 =
1102
1101
OrElseRightFrame k writtenOuter writtenOuterSeq createdOuterSeq ctl' -> do
1103
1102
-- Commit the TVars written in this sub-transaction that are also
1104
1103
-- 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)
1107
1106
-- Merge the written set of the inner with the outer
1108
1107
let written' = Map. union written writtenOuter
1109
1108
writtenSeq' = filter (\ (SomeTVar tvar) ->
@@ -1117,30 +1116,30 @@ execAtomically time tid tlbl nextVid0 action0 k0 =
1117
1116
ThrowStm e ->
1118
1117
{-# SCC "execAtomically.go.ThrowStm" #-} do
1119
1118
-- Revert all the TVar writes
1120
- traverse_ (\ (SomeTVar tvar) -> revertTVar tvar) written
1119
+ ! _ <- traverse_ (\ (SomeTVar tvar) -> revertTVar tvar) written
1121
1120
k0 $ StmTxAborted (Map. elems read ) (toException e)
1122
1121
1123
1122
Retry ->
1124
1123
{-# SCC "execAtomically.go.Retry" #-}
1125
1124
case ctl of
1126
1125
AtomicallyFrame -> do
1127
1126
-- Revert all the TVar writes
1128
- traverse_ (\ (SomeTVar tvar) -> revertTVar tvar) written
1127
+ ! _ <- traverse_ (\ (SomeTVar tvar) -> revertTVar tvar) written
1129
1128
-- Return vars read, so the thread can block on them
1130
- k0 $ StmTxBlocked ( Map. elems read )
1129
+ k0 $! StmTxBlocked $! Map. elems read
1131
1130
1132
1131
OrElseLeftFrame b k writtenOuter writtenOuterSeq createdOuterSeq ctl' ->
1133
1132
{-# SCC "execAtomically.go.OrElseLeftFrame" #-} do
1134
1133
-- Revert all the TVar writes within this orElse
1135
- traverse_ (\ (SomeTVar tvar) -> revertTVar tvar) written
1134
+ ! _ <- traverse_ (\ (SomeTVar tvar) -> revertTVar tvar) written
1136
1135
-- Execute the orElse right hand with an empty written set
1137
1136
let ctl'' = OrElseRightFrame k writtenOuter writtenOuterSeq createdOuterSeq ctl'
1138
1137
go ctl'' read Map. empty [] [] nextVid b
1139
1138
1140
1139
OrElseRightFrame _k writtenOuter writtenOuterSeq createdOuterSeq ctl' ->
1141
1140
{-# SCC "execAtomically.go.OrElseRightFrame" #-} do
1142
1141
-- Revert all the TVar writes within this orElse branch
1143
- traverse_ (\ (SomeTVar tvar) -> revertTVar tvar) written
1142
+ ! _ <- traverse_ (\ (SomeTVar tvar) -> revertTVar tvar) written
1144
1143
-- Skip the continuation and propagate the retry into the outer frame
1145
1144
-- using the written set for the outer frame
1146
1145
go ctl' read writtenOuter writtenOuterSeq createdOuterSeq nextVid Retry
@@ -1153,21 +1152,21 @@ execAtomically time tid tlbl nextVid0 action0 k0 =
1153
1152
1154
1153
NewTVar ! mbLabel x k ->
1155
1154
{-# SCC "execAtomically.go.NewTVar" #-} do
1156
- v <- execNewTVar nextVid mbLabel x
1155
+ ! v <- execNewTVar nextVid mbLabel x
1157
1156
-- record a write to the TVar so we know to update its VClock
1158
1157
let written' = Map. insert (tvarId v) (SomeTVar v) written
1159
1158
-- save the value: it will be committed or reverted
1160
- saveTVar v
1159
+ ! _ <- saveTVar v
1161
1160
go ctl read written' writtenSeq (SomeTVar v : createdSeq) (succ nextVid) (k v)
1162
1161
1163
1162
LabelTVar ! label tvar k ->
1164
1163
{-# SCC "execAtomically.go.LabelTVar" #-} do
1165
- writeSTRef (tvarLabel tvar) $! (Just label)
1164
+ ! _ <- writeSTRef (tvarLabel tvar) $! (Just label)
1166
1165
go ctl read written writtenSeq createdSeq nextVid k
1167
1166
1168
1167
TraceTVar tvar f k ->
1169
1168
{-# SCC "execAtomically.go.TraceTVar" #-} do
1170
- writeSTRef (tvarTrace tvar) (Just f)
1169
+ ! _ <- writeSTRef (tvarTrace tvar) (Just f)
1171
1170
go ctl read written writtenSeq createdSeq nextVid k
1172
1171
1173
1172
ReadTVar v k
@@ -1184,10 +1183,12 @@ execAtomically time tid tlbl nextVid0 action0 k0 =
1184
1183
WriteTVar v x k
1185
1184
| tvarId v `Map.member` written ->
1186
1185
{-# SCC "execAtomically.go.WriteTVar" #-} do
1186
+ ! _ <- execWriteTVar v x
1187
1187
go ctl read written writtenSeq createdSeq nextVid k
1188
1188
| otherwise ->
1189
1189
{-# SCC "execAtomically.go.WriteTVar" #-} do
1190
- execWriteTVar v x
1190
+ ! _ <- saveTVar v
1191
+ ! _ <- execWriteTVar v x
1191
1192
let written' = Map. insert (tvarId v) (SomeTVar v) written
1192
1193
go ctl read written' (SomeTVar v : writtenSeq) createdSeq nextVid k
1193
1194
@@ -1220,18 +1221,18 @@ execAtomically' = go Map.empty
1220
1221
-> ST s [SomeTVar s ]
1221
1222
go ! written action = case action of
1222
1223
ReturnStm () -> do
1223
- traverse_ (\ (SomeTVar tvar) -> commitTVar tvar) written
1224
+ ! _ <- traverse_ (\ (SomeTVar tvar) -> commitTVar tvar) written
1224
1225
return (Map. elems written)
1225
1226
ReadTVar v k -> do
1226
1227
x <- execReadTVar v
1227
1228
go written (k x)
1228
1229
WriteTVar v x k
1229
1230
| tvarId v `Map.member` written -> do
1230
- execWriteTVar v x
1231
+ ! _ <- execWriteTVar v x
1231
1232
go written k
1232
1233
| otherwise -> do
1233
- saveTVar v
1234
- execWriteTVar v x
1234
+ ! _ <- saveTVar v
1235
+ ! _ <- execWriteTVar v x
1235
1236
let written' = Map. insert (tvarId v) (SomeTVar v) written
1236
1237
go written' k
1237
1238
_ -> error " execAtomically': only for special case of reads and writes"
0 commit comments