Skip to content

Commit ac6ec44

Browse files
committed
io-sim: traceTVar for registerDelay tvars
As consequence we also change that `execAtomically'` like `execActomically` does not executes `commitTVar`, otherwise we'd get an error when calling `traceTVarST`.
1 parent 38222f6 commit ac6ec44

File tree

2 files changed

+22
-3
lines changed

2 files changed

+22
-3
lines changed

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

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -460,6 +460,9 @@ schedule !thread@Thread{
460460
let !timers' = PSQ.delete tmid timers
461461
!thread' = thread { threadControl = ThreadControl k ctl }
462462
!written <- execAtomically' (runSTM $ writeTVar tvar TimeoutCancelled)
463+
-- note: we are not running traceTVar on 'tvar', since its not exposed to
464+
-- the user, and thus it cannot have an attached callback.
465+
!_ <- traverse_ (\(SomeTVar tvar') -> commitTVar tvar') written
463466
(wakeup, wokeby) <- threadsUnblockedByWrites written
464467
mapM_ (\(SomeTVar var) -> unblockAllThreadsFromTVar var) written
465468
let (unblocked,
@@ -769,6 +772,10 @@ reschedule !simstate@SimState{ threads, timers, curTime = time } =
769772
-- Reuse the STM functionality here to write all the timer TVars.
770773
-- Simplify to a special case that only reads and writes TVars.
771774
!written <- execAtomically' (runSTM $ mapM_ timeoutSTMAction fired)
775+
!ds <- traverse (\(SomeTVar tvar) -> do
776+
tr <- traceTVarST tvar False
777+
!_ <- commitTVar tvar
778+
return tr) written
772779
(wakeupSTM, wokeby) <- threadsUnblockedByWrites written
773780
!_ <- mapM_ (\(SomeTVar tvar) -> unblockAllThreadsFromTVar tvar) written
774781

@@ -794,6 +801,10 @@ reschedule !simstate@SimState{ threads, timers, curTime = time } =
794801
++ [ ( time', ThreadId [-1], Just "register delay timer"
795802
, EventRegisterDelayFired tmid)
796803
| (tmid, TimerRegisterDelay _) <- zip tmids fired ]
804+
++ [ (time', ThreadId [-1], Just "register delay timer", EventLog (toDyn a))
805+
| TraceValue { traceDynamic = Just a } <- ds ]
806+
++ [ (time', ThreadId [-1], Just "register delay timer", EventSay a)
807+
| TraceValue { traceString = Just a } <- ds ]
797808
++ [ (time', tid', tlbl', EventTxWakeup vids)
798809
| tid' <- wakeupSTM
799810
, let tlbl' = lookupThreadLabel tid' threads
@@ -809,6 +820,7 @@ reschedule !simstate@SimState{ threads, timers, curTime = time } =
809820
| (tid, _, _) <- timeoutExpired ])
810821
trace
811822
where
823+
timeoutSTMAction :: TimerCompletionInfo s -> STM s ()
812824
timeoutSTMAction (Timer var) = do
813825
x <- readTVar var
814826
case x of
@@ -1244,7 +1256,6 @@ execAtomically' = go Map.empty
12441256
-> ST s [SomeTVar s]
12451257
go !written action = case action of
12461258
ReturnStm () -> do
1247-
!_ <- traverse_ (\(SomeTVar tvar) -> commitTVar tvar) written
12481259
return (Map.elems written)
12491260
ReadTVar v k -> do
12501261
x <- execReadTVar v
@@ -1322,7 +1333,7 @@ readTVarUndos TVar{tvarUndo} = readSTRef tvarUndo
13221333
traceTVarST :: TVar s a
13231334
-> Bool -- true if it's a new 'TVar'
13241335
-> ST s TraceValue
1325-
traceTVarST TVar{tvarCurrent, tvarUndo, tvarTrace} new = do
1336+
traceTVarST TVar{tvarId, tvarCurrent, tvarUndo, tvarTrace} new = do
13261337
mf <- readSTRef tvarTrace
13271338
case mf of
13281339
Nothing -> return TraceValue { traceDynamic = (Nothing :: Maybe ())
@@ -1333,7 +1344,7 @@ traceTVarST TVar{tvarCurrent, tvarUndo, tvarTrace} new = do
13331344
case (new, vs) of
13341345
(True, _) -> f Nothing v
13351346
(_, _:_) -> f (Just $ last vs) v
1336-
_ -> error "traceTVarST: unexpected tvar state"
1347+
_ -> error ("traceTVarST: unexpected tvar state " ++ show tvarId)
13371348

13381349

13391350

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1021,6 +1021,10 @@ reschedule simstate@SimState{ threads, timers, curTime = time, races } =
10211021
-- Reuse the STM functionality here to write all the timer TVars.
10221022
-- Simplify to a special case that only reads and writes TVars.
10231023
written <- execAtomically' (runSTM $ mapM_ timeoutAction fired)
1024+
!ds <- traverse (\(SomeTVar tvar) -> do
1025+
tr <- traceTVarST tvar False
1026+
!_ <- commitTVar tvar
1027+
return tr) written
10241028
(wakeupSTM, wokeby) <- threadsUnblockedByWrites written
10251029
mapM_ (\(SomeTVar tvar) -> unblockAllThreadsFromTVar tvar) written
10261030

@@ -1046,6 +1050,10 @@ reschedule simstate@SimState{ threads, timers, curTime = time, races } =
10461050
++ [ ( time', ThreadId [-1], -1, Just "register delay timer"
10471051
, EventRegisterDelayFired tmid)
10481052
| (tmid, TimerRegisterDelay _) <- zip tmids fired ]
1053+
++ [ (time', ThreadId [-1], -1, Just "register delay timer", EventLog (toDyn a))
1054+
| TraceValue { traceDynamic = Just a } <- ds ]
1055+
++ [ (time', ThreadId [-1], -1, Just "register delay timer", EventSay a)
1056+
| TraceValue { traceString = Just a } <- ds ]
10491057
++ [ (time', tid', -1, tlbl', EventTxWakeup vids)
10501058
| tid' <- wakeupSTM
10511059
, let tlbl' = lookupThreadLabel tid' threads

0 commit comments

Comments
 (0)