Skip to content

Commit 8b5ea8d

Browse files
iohk-bors[bot]coot
andauthored
Merge #3647
3647: IOSim MonadFix instance r=coot a=coot Co-authored-by: Marcin Szamotulski <[email protected]> Co-authored-by: Marcin Szamotulski <[email protected]>
2 parents cf107e9 + 9778b24 commit 8b5ea8d

File tree

9 files changed

+434
-136
lines changed

9 files changed

+434
-136
lines changed

io-classes/src/Control/Monad/Class/MonadSTM.hs

Lines changed: 74 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,10 @@
55
{-# LANGUAGE GADTs #-}
66
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
77
{-# LANGUAGE MultiParamTypeClasses #-}
8+
{-# LANGUAGE NamedFieldPuns #-}
9+
{-# LANGUAGE PatternSynonyms #-}
810
{-# LANGUAGE RankNTypes #-}
11+
{-# LANGUAGE ScopedTypeVariables #-}
912
{-# LANGUAGE StandaloneDeriving #-}
1013
{-# LANGUAGE TypeFamilies #-}
1114
{-# LANGUAGE TypeFamilyDependencies #-}
@@ -16,6 +19,8 @@ module Control.Monad.Class.MonadSTM
1619
( MonadSTM (..)
1720
, MonadLabelledSTM (..)
1821
, MonadInspectSTM (..)
22+
, TraceValue (TraceValue, TraceDynamic, TraceString, DontTrace, traceDynamic,
23+
traceString)
1924
, MonadTraceSTM (..)
2025
, LazyTVar
2126
, LazyTMVar
@@ -263,106 +268,128 @@ instance MonadInspectSTM IO where
263268
inspectTMVar _ = atomically . tryReadTMVar
264269

265270

271+
-- | A GADT which instructs how to trace the value. The 'traceDynamic' will
272+
-- use dynamic tracing, e.g. 'Control.Monad.IOSim.traceM'; while 'traceString'
273+
-- will be traced with 'EventSay'.
274+
--
275+
data TraceValue where
276+
TraceValue :: forall tr. Typeable tr
277+
=> { traceDynamic :: Maybe tr
278+
, traceString :: Maybe String
279+
}
280+
-> TraceValue
281+
282+
283+
-- | Use only dynamic tracer.
284+
--
285+
pattern TraceDynamic :: () => forall tr. Typeable tr => tr -> TraceValue
286+
pattern TraceDynamic tr <- TraceValue { traceDynamic = Just tr }
287+
where
288+
TraceDynamic tr = TraceValue { traceDynamic = Just tr, traceString = Nothing }
289+
290+
-- | Use only string tracing.
291+
--
292+
pattern TraceString :: String -> TraceValue
293+
pattern TraceString tr <- TraceValue { traceString = Just tr }
294+
where
295+
TraceString tr = TraceValue { traceDynamic = (Nothing :: Maybe ())
296+
, traceString = Just tr
297+
}
298+
299+
-- | Do not trace the value.
300+
--
301+
pattern DontTrace :: TraceValue
302+
pattern DontTrace <- TraceValue Nothing Nothing
303+
where
304+
DontTrace = TraceValue (Nothing :: Maybe ()) Nothing
305+
266306
-- | 'MonadTraceSTM' allows to trace values of stm variables when stm
267-
-- transaction is commited. This allows to verify invariants when a variable
268-
-- is commited.
307+
-- transaction is committed. This allows to verify invariants when a variable
308+
-- is committed.
269309
--
270310
class MonadInspectSTM m
271311
=> MonadTraceSTM m where
272312
-- | Construct a trace out of previous & new value of a 'TVar'. The callback
273313
-- is called whenever an stm transaction which modifies the 'TVar' is
274-
-- commited.
314+
-- committed.
275315
--
276316
-- This is supported by 'IOSim' and 'IOSimPOR'; 'IO' has a trivial instance.
277317
--
278318
{-# MINIMAL traceTVar, traceTQueue, traceTBQueue #-}
279319

280-
traceTVar :: Typeable tr
281-
=> proxy m
320+
traceTVar :: proxy m
282321
-> TVar m a
283-
-> (Maybe a -> a -> InspectMonad m tr)
322+
-> (Maybe a -> a -> InspectMonad m TraceValue)
284323
-- ^ callback which receives initial value or 'Nothing' (if it
285-
-- is a newly created 'TVar'), and the commited value.
324+
-- is a newly created 'TVar'), and the committed value.
286325
-> STM m ()
287326

288327

289-
traceTMVar :: Typeable tr
290-
=> proxy m
328+
traceTMVar :: proxy m
291329
-> TMVar m a
292-
-> (Maybe (Maybe a) -> (Maybe a) -> InspectMonad m tr)
330+
-> (Maybe (Maybe a) -> (Maybe a) -> InspectMonad m TraceValue)
293331
-> STM m ()
294332

295-
traceTQueue :: Typeable tr
296-
=> proxy m
333+
traceTQueue :: proxy m
297334
-> TQueue m a
298-
-> (Maybe [a] -> [a] -> InspectMonad m tr)
335+
-> (Maybe [a] -> [a] -> InspectMonad m TraceValue)
299336
-> STM m ()
300337

301-
traceTBQueue :: Typeable tr
302-
=> proxy m
338+
traceTBQueue :: proxy m
303339
-> TBQueue m a
304-
-> (Maybe [a] -> [a] -> InspectMonad m tr)
340+
-> (Maybe [a] -> [a] -> InspectMonad m TraceValue)
305341
-> STM m ()
306342

307343
default traceTMVar :: ( TMVar m a ~ TMVarDefault m a
308-
, Typeable tr
309344
)
310345
=> proxy m
311346
-> TMVar m a
312-
-> (Maybe (Maybe a) -> (Maybe a) -> InspectMonad m tr)
347+
-> (Maybe (Maybe a) -> (Maybe a) -> InspectMonad m TraceValue)
313348
-> STM m ()
314349
traceTMVar = traceTMVarDefault
315350

316351

317-
traceTVarIO :: Typeable tr
318-
=> proxy m
352+
traceTVarIO :: proxy m
319353
-> TVar m a
320-
-> (Maybe a -> a -> InspectMonad m tr)
354+
-> (Maybe a -> a -> InspectMonad m TraceValue)
321355
-> m ()
322356

323-
traceTMVarIO :: Typeable tr
324-
=> proxy m
357+
traceTMVarIO :: proxy m
325358
-> TMVar m a
326-
-> (Maybe (Maybe a) -> (Maybe a) -> InspectMonad m tr)
359+
-> (Maybe (Maybe a) -> (Maybe a) -> InspectMonad m TraceValue)
327360
-> m ()
328361

329-
traceTQueueIO :: Typeable tr
330-
=> proxy m
362+
traceTQueueIO :: proxy m
331363
-> TQueue m a
332-
-> (Maybe [a] -> [a] -> InspectMonad m tr)
364+
-> (Maybe [a] -> [a] -> InspectMonad m TraceValue)
333365
-> m ()
334366

335-
traceTBQueueIO :: Typeable tr
336-
=> proxy m
367+
traceTBQueueIO :: proxy m
337368
-> TBQueue m a
338-
-> (Maybe [a] -> [a] -> InspectMonad m tr)
369+
-> (Maybe [a] -> [a] -> InspectMonad m TraceValue)
339370
-> m ()
340371

341-
default traceTVarIO :: Typeable tr
342-
=> proxy m
372+
default traceTVarIO :: proxy m
343373
-> TVar m a
344-
-> (Maybe a -> a -> InspectMonad m tr)
374+
-> (Maybe a -> a -> InspectMonad m TraceValue)
345375
-> m ()
346376
traceTVarIO = \p v f -> atomically (traceTVar p v f)
347377

348-
default traceTMVarIO :: Typeable tr
349-
=> proxy m
378+
default traceTMVarIO :: proxy m
350379
-> TMVar m a
351-
-> (Maybe (Maybe a) -> (Maybe a) -> InspectMonad m tr)
380+
-> (Maybe (Maybe a) -> (Maybe a) -> InspectMonad m TraceValue)
352381
-> m ()
353382
traceTMVarIO = \p v f -> atomically (traceTMVar p v f)
354383

355-
default traceTQueueIO :: Typeable tr
356-
=> proxy m
384+
default traceTQueueIO :: proxy m
357385
-> TQueue m a
358-
-> (Maybe [a] -> [a] -> InspectMonad m tr)
386+
-> (Maybe [a] -> [a] -> InspectMonad m TraceValue)
359387
-> m ()
360388
traceTQueueIO = \p v f -> atomically (traceTQueue p v f)
361389

362-
default traceTBQueueIO :: Typeable tr
363-
=> proxy m
390+
default traceTBQueueIO :: proxy m
364391
-> TBQueue m a
365-
-> (Maybe [a] -> [a] -> InspectMonad m tr)
392+
-> (Maybe [a] -> [a] -> InspectMonad m TraceValue)
366393
-> m ()
367394
traceTBQueueIO = \p v f -> atomically (traceTBQueue p v f)
368395

@@ -480,10 +507,10 @@ labelTMVarDefault
480507
labelTMVarDefault (TMVar tvar) = labelTVar tvar
481508

482509
traceTMVarDefault
483-
:: (MonadTraceSTM m, Typeable tr)
510+
:: MonadTraceSTM m
484511
=> proxy m
485512
-> TMVarDefault m a
486-
-> (Maybe (Maybe a) -> Maybe a -> InspectMonad m tr)
513+
-> (Maybe (Maybe a) -> Maybe a -> InspectMonad m TraceValue)
487514
-> STM m ()
488515
traceTMVarDefault p (TMVar t) f = traceTVar p t f
489516

@@ -764,7 +791,7 @@ throwSTM :: (MonadSTM m, MonadThrow.MonadThrow (STM m), Exception e)
764791
throwSTM = MonadThrow.throwIO
765792

766793

767-
-- | 'catch' speclialized for an @stm@ monad.
794+
-- | 'catch' specialized for an @stm@ monad.
768795
--
769796
catchSTM :: (MonadSTM m, MonadThrow.MonadCatch (STM m), Exception e)
770797
=> STM m a -> (e -> STM m a) -> STM m a
@@ -797,8 +824,8 @@ deriving instance MonadSTM m => MonadPlus (WrappedSTM t r m)
797824
-- extension because it violates 3rd Paterson condition, however `STM m` will
798825
-- resolve to a concrete type of kind (Type -> Type), and thus no larger than
799826
-- `m` itself, e.g. for `m ~ ReaderT r f`, `STM m ~ WrappedSTM Reader r f`.
800-
-- Instance resolution will termniate as soon as the monad transformer stack
801-
-- depth is exhousted.
827+
-- Instance resolution will terminate as soon as the monad transformer stack
828+
-- depth is exhausted.
802829
instance ( MonadSTM m
803830
, MonadThrow.MonadThrow (STM m)
804831
, MonadThrow.MonadCatch (STM m)

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

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -333,15 +333,23 @@ ppEvents :: [(Time, ThreadId, Maybe ThreadLabel, SimEventType)]
333333
-> String
334334
ppEvents events =
335335
intercalate "\n"
336-
[ ppSimEvent width
336+
[ ppSimEvent timeWidth tidWidth width
337337
SimEvent {seTime, seThreadId, seThreadLabel, seType }
338338
| (seTime, seThreadId, seThreadLabel, seType) <- events
339339
]
340340
where
341-
width = maximum
342-
[ maybe 0 length threadLabel
343-
| (_, _, threadLabel, _) <- events
344-
]
341+
timeWidth = maximum
342+
[ length (show t)
343+
| (t, _, _, _) <- events
344+
]
345+
tidWidth = maximum
346+
[ length (show tid)
347+
| (_, tid, _, _) <- events
348+
]
349+
width = maximum
350+
[ maybe 0 length threadLabel
351+
| (_, _, threadLabel, _) <- events
352+
]
345353

346354

347355
-- | See 'runSimTraceST' below.

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

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,13 @@
77
--
88
module Control.Monad.IOSim.CommonTypes where
99

10+
import Control.Monad.Class.MonadSTM (TraceValue)
1011
import Control.Monad.ST.Lazy
1112

1213
import Data.Function (on)
1314
import Data.Map (Map)
1415
import Data.Set (Set)
1516
import Data.STRef.Lazy
16-
import Data.Typeable (Typeable)
1717

1818
data ThreadId = RacyThreadId [Int]
1919
| ThreadId [Int] -- non racy threads have higher priority
@@ -72,16 +72,12 @@ data TVar s a = TVar {
7272

7373
-- | Callback to construct a trace which will be attached to the dynamic
7474
-- trace.
75-
tvarTrace :: !(STRef s (Maybe (MkTVarTrace s a)))
75+
tvarTrace :: !(STRef s (Maybe (Maybe a -> a -> ST s TraceValue)))
7676
}
7777

7878
instance Eq (TVar s a) where
7979
(==) = on (==) tvarId
8080

81-
data MkTVarTrace s a where
82-
MkTVarTrace :: forall s a tr. Typeable tr => (Maybe a -> a -> ST s tr)
83-
-> MkTVarTrace s a
84-
8581
data SomeTVar s where
8682
SomeTVar :: !(TVar s a) -> SomeTVar s
8783

0 commit comments

Comments
 (0)