@@ -460,6 +460,9 @@ schedule !thread@Thread{
460
460
let ! timers' = PSQ. delete tmid timers
461
461
! thread' = thread { threadControl = ThreadControl k ctl }
462
462
! 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
463
466
(wakeup, wokeby) <- threadsUnblockedByWrites written
464
467
mapM_ (\ (SomeTVar var) -> unblockAllThreadsFromTVar var) written
465
468
let (unblocked,
@@ -769,6 +772,10 @@ reschedule !simstate@SimState{ threads, timers, curTime = time } =
769
772
-- Reuse the STM functionality here to write all the timer TVars.
770
773
-- Simplify to a special case that only reads and writes TVars.
771
774
! written <- execAtomically' (runSTM $ mapM_ timeoutSTMAction fired)
775
+ ! ds <- traverse (\ (SomeTVar tvar) -> do
776
+ tr <- traceTVarST tvar False
777
+ ! _ <- commitTVar tvar
778
+ return tr) written
772
779
(wakeupSTM, wokeby) <- threadsUnblockedByWrites written
773
780
! _ <- mapM_ (\ (SomeTVar tvar) -> unblockAllThreadsFromTVar tvar) written
774
781
@@ -794,6 +801,10 @@ reschedule !simstate@SimState{ threads, timers, curTime = time } =
794
801
++ [ ( time', ThreadId [- 1 ], Just " register delay timer"
795
802
, EventRegisterDelayFired tmid)
796
803
| (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 ]
797
808
++ [ (time', tid', tlbl', EventTxWakeup vids)
798
809
| tid' <- wakeupSTM
799
810
, let tlbl' = lookupThreadLabel tid' threads
@@ -809,6 +820,7 @@ reschedule !simstate@SimState{ threads, timers, curTime = time } =
809
820
| (tid, _, _) <- timeoutExpired ])
810
821
trace
811
822
where
823
+ timeoutSTMAction :: TimerCompletionInfo s -> STM s ()
812
824
timeoutSTMAction (Timer var) = do
813
825
x <- readTVar var
814
826
case x of
@@ -1244,7 +1256,6 @@ execAtomically' = go Map.empty
1244
1256
-> ST s [SomeTVar s ]
1245
1257
go ! written action = case action of
1246
1258
ReturnStm () -> do
1247
- ! _ <- traverse_ (\ (SomeTVar tvar) -> commitTVar tvar) written
1248
1259
return (Map. elems written)
1249
1260
ReadTVar v k -> do
1250
1261
x <- execReadTVar v
@@ -1322,7 +1333,7 @@ readTVarUndos TVar{tvarUndo} = readSTRef tvarUndo
1322
1333
traceTVarST :: TVar s a
1323
1334
-> Bool -- true if it's a new 'TVar'
1324
1335
-> ST s TraceValue
1325
- traceTVarST TVar {tvarCurrent, tvarUndo, tvarTrace} new = do
1336
+ traceTVarST TVar {tvarId, tvarCurrent, tvarUndo, tvarTrace} new = do
1326
1337
mf <- readSTRef tvarTrace
1327
1338
case mf of
1328
1339
Nothing -> return TraceValue { traceDynamic = (Nothing :: Maybe () )
@@ -1333,7 +1344,7 @@ traceTVarST TVar{tvarCurrent, tvarUndo, tvarTrace} new = do
1333
1344
case (new, vs) of
1334
1345
(True , _) -> f Nothing v
1335
1346
(_, _: _) -> f (Just $ last vs) v
1336
- _ -> error " traceTVarST: unexpected tvar state"
1347
+ _ -> error ( " traceTVarST: unexpected tvar state " ++ show tvarId)
1337
1348
1338
1349
1339
1350
0 commit comments