5
5
{-# LANGUAGE ExistentialQuantification #-}
6
6
{-# LANGUAGE FlexibleInstances #-}
7
7
{-# LANGUAGE GADTSyntax #-}
8
+ {-# LANGUAGE LambdaCase #-}
8
9
{-# LANGUAGE MultiParamTypeClasses #-}
9
10
{-# LANGUAGE NamedFieldPuns #-}
10
11
{-# LANGUAGE NumericUnderscores #-}
@@ -22,7 +23,6 @@ module Control.Monad.IOSim.Types
22
23
, traceSTM
23
24
, liftST
24
25
, SimA (.. )
25
- , StepId
26
26
, STMSim
27
27
, STM (.. )
28
28
, runSTM
@@ -46,6 +46,7 @@ module Control.Monad.IOSim.Types
46
46
, EventlogEvent (.. )
47
47
, EventlogMarker (.. )
48
48
, SimEventType (.. )
49
+ , ppSimEventType
49
50
, SimEvent (.. )
50
51
, SimResult (.. )
51
52
, SimTrace
@@ -767,31 +768,35 @@ ppSimEvent :: Int -- ^ width of the time
767
768
-> Int -- ^ width of thread label
768
769
-> SimEvent
769
770
-> String
770
- ppSimEvent timeWidth tidWidth tLabelWidth SimEvent {seTime, seThreadId, seThreadLabel, seType} =
771
+
772
+ ppSimEvent timeWidth tidWidth tLabelWidth SimEvent {seTime = Time time, seThreadId, seThreadLabel, seType} =
771
773
printf " %-*s - %-*s %-*s - %s"
772
774
timeWidth
773
- (show seTime )
775
+ (show time )
774
776
tidWidth
775
- (show seThreadId)
777
+ (ppIOSimThreadId seThreadId)
776
778
tLabelWidth
777
779
threadLabel
778
- (show seType)
780
+ (ppSimEventType seType)
779
781
where
780
782
threadLabel = fromMaybe " " seThreadLabel
781
- ppSimEvent timeWidth tidWidth tLableWidth SimPOREvent {seTime, seThreadId, seStep, seThreadLabel, seType} =
783
+
784
+ ppSimEvent timeWidth tidWidth tLableWidth SimPOREvent {seTime = Time time, seThreadId, seStep, seThreadLabel, seType} =
782
785
printf " %-*s - %-*s %-*s - %s"
783
786
timeWidth
784
- (show seTime )
787
+ (show time )
785
788
tidWidth
786
- (show (seThreadId, seStep))
789
+ (ppStepId (seThreadId, seStep))
787
790
tLableWidth
788
791
threadLabel
789
- (show seType)
792
+ (ppSimEventType seType)
790
793
where
791
794
threadLabel = fromMaybe " " seThreadLabel
795
+
792
796
ppSimEvent _ _ _ (SimRacesFound controls) =
793
797
" RacesFound " ++ show controls
794
798
799
+
795
800
-- | A result type of a simulation.
796
801
data SimResult a
797
802
= MainReturn ! Time a ! [Labelled IOSimThreadId ]
@@ -805,6 +810,7 @@ data SimResult a
805
810
| Loop
806
811
-- ^ Only returned by /IOSimPOR/ when a step execution took longer than
807
812
-- 'explorationStepTimelimit` was exceeded.
813
+ | InternalError String
808
814
deriving (Show , Functor )
809
815
810
816
-- | A type alias for 'IOSim' simulation trace. It comes with useful pattern
@@ -867,6 +873,8 @@ ppTrace_ tr = Trace.ppTrace
867
873
)
868
874
$ tr
869
875
876
+
877
+
870
878
-- | Trace each event using 'Debug.trace'; this is useful when a trace ends with
871
879
-- a pure error, e.g. an assertion.
872
880
--
@@ -1029,6 +1037,91 @@ data SimEventType
1029
1037
-- a simulation. Useful for debugging IOSimPOR.
1030
1038
deriving Show
1031
1039
1040
+ ppSimEventType :: SimEventType -> String
1041
+ ppSimEventType = \ case
1042
+ EventSay a -> " Say " ++ a
1043
+ EventLog a -> " Dynamic " ++ show a
1044
+ EventMask a -> " Mask " ++ show a
1045
+ EventThrow a -> " Throw " ++ show a
1046
+ EventThrowTo err tid ->
1047
+ concat [ " ThrowTo (" ,
1048
+ show err, " ) " ,
1049
+ ppIOSimThreadId tid ]
1050
+ EventThrowToBlocked -> " ThrowToBlocked"
1051
+ EventThrowToWakeup -> " ThrowToWakeup"
1052
+ EventThrowToUnmasked a ->
1053
+ " ThrowToUnmasked " ++ ppLabelled ppIOSimThreadId a
1054
+ EventThreadForked a ->
1055
+ " ThreadForked " ++ ppIOSimThreadId a
1056
+ EventThreadFinished -> " ThreadFinished"
1057
+ EventThreadUnhandled a ->
1058
+ " ThreadUnhandled " ++ show a
1059
+ EventTxCommitted written created mbEff ->
1060
+ concat [ " TxCommitted " ,
1061
+ ppList (ppLabelled show ) written, " " ,
1062
+ ppList (ppLabelled show ) created,
1063
+ maybe " " ((' ' : ) . ppEffect) mbEff ]
1064
+
1065
+ EventTxAborted mbEff ->
1066
+ concat [ " TxAborted" ,
1067
+ maybe " " ((' ' : ) . ppEffect) mbEff ]
1068
+ EventTxBlocked blocked mbEff ->
1069
+ concat [ " TxBlocked " ,
1070
+ ppList (ppLabelled show ) blocked,
1071
+ maybe " " ((' ' : ) . ppEffect) mbEff ]
1072
+ EventTxWakeup changed ->
1073
+ " TxWakeup " ++ ppList (ppLabelled show ) changed
1074
+ EventUnblocked unblocked ->
1075
+ " Unblocked " ++ ppList ppIOSimThreadId unblocked
1076
+ EventThreadDelay tid t ->
1077
+ concat [ " ThreadDelay " ,
1078
+ show tid, " " ,
1079
+ show t ]
1080
+ EventThreadDelayFired tid -> " ThreadDelayFired " ++ show tid
1081
+ EventTimeoutCreated timer tid t ->
1082
+ concat [ " TimeoutCreated " ,
1083
+ show timer, " " ,
1084
+ ppIOSimThreadId tid, " " ,
1085
+ show t ]
1086
+ EventTimeoutFired timer ->
1087
+ " TimeoutFired " ++ show timer
1088
+ EventRegisterDelayCreated timer tvarId t ->
1089
+ concat [ " RegisterDelayCreated " ,
1090
+ show timer, " " ,
1091
+ show tvarId, " " ,
1092
+ show t ]
1093
+ EventRegisterDelayFired timer -> " RegisterDelayFired " ++ show timer
1094
+ EventTimerCreated timer tvarId t ->
1095
+ concat [ " TimerCreated " ,
1096
+ show timer, " " ,
1097
+ show tvarId, " " ,
1098
+ show t ]
1099
+ EventTimerUpdated timer t ->
1100
+ concat [ " TimerUpdated " ,
1101
+ show timer, " " ,
1102
+ show t ]
1103
+ EventTimerCancelled timer -> " TimerCancelled " ++ show timer
1104
+ EventTimerFired timer -> " TimerFired " ++ show timer
1105
+ EventThreadStatus tid tid' ->
1106
+ concat [ " ThreadStatus " ,
1107
+ ppIOSimThreadId tid, " " ,
1108
+ ppIOSimThreadId tid' ]
1109
+ EventSimStart a -> " SimStart " ++ show a
1110
+ EventThreadSleep -> " ThreadSleep"
1111
+ EventThreadWake -> " ThreadWake"
1112
+ EventDeschedule a -> " Deschedule " ++ show a
1113
+ EventFollowControl a -> " FollowControl " ++ show a
1114
+ EventAwaitControl s a ->
1115
+ concat [ " AwaitControl " ,
1116
+ ppStepId s, " " ,
1117
+ show a ]
1118
+ EventPerformAction a -> " PerformAction " ++ ppStepId a
1119
+ EventReschedule a -> " Reschedule " ++ show a
1120
+ EventEffect clock eff ->
1121
+ concat [ " Effect " ,
1122
+ ppVectorClock clock, " " ,
1123
+ ppEffect eff ]
1124
+ EventRaces a -> " Races " ++ show a
1032
1125
1033
1126
-- | A labelled value.
1034
1127
--
@@ -1041,6 +1134,10 @@ data Labelled a = Labelled {
1041
1134
deriving (Eq , Ord , Generic )
1042
1135
deriving Show via Quiet (Labelled a )
1043
1136
1137
+ ppLabelled :: (a -> String ) -> Labelled a -> String
1138
+ ppLabelled pp Labelled { l_labelled = a, l_label = Nothing } = pp a
1139
+ ppLabelled pp Labelled { l_labelled = a, l_label = Just lbl } = concat [" Labelled " , pp a, " " , lbl]
1140
+
1044
1141
--
1045
1142
-- Executing STM Transactions
1046
1143
--
0 commit comments