Skip to content

coot/bolt12/monad trace mvar #214

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 6 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -25,3 +25,4 @@ cabal.project.local~
tags
io-sim/tags
README.haddock
*.vim
2 changes: 1 addition & 1 deletion cabal.project
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ package io-classes
package strict-stm
flags: +asserts

if impl (ghc >= 9.12)
if impl (ghc >= 9.10.2)
allow-newer:
-- Stuck on `cabal-3.14` issues and recalcitrant maintainers
-- https://github.com/haskell/aeson/issues/1124
Expand Down
2 changes: 2 additions & 0 deletions io-classes/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@

### Breaking changes

* Provided `MonadTraceMVar`
* Renamed `InspectMonad` to `InspectMonadSTM`
* Added `threadLabel` to `MonadThread`
* Added `MonadLabelledMVar` class.
* Added `labelMVar` to `Control.Concurrent.Class.MonadMVar.Strict`
Expand Down
16 changes: 8 additions & 8 deletions io-classes/mtl/Control/Monad/Class/MonadSTM/Trans.hs
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,7 @@ instance MonadSTM m => MonadSTM (ContT r m) where


instance MonadInspectSTM m => MonadInspectSTM (ContT r m) where
type InspectMonad (ContT r m) = InspectMonad m
type InspectMonadSTM (ContT r m) = InspectMonadSTM m
inspectTVar _ = inspectTVar (Proxy @m)
inspectTMVar _ = inspectTMVar (Proxy @m)

Expand Down Expand Up @@ -254,7 +254,7 @@ instance (Monoid w, MonadSTM m) => MonadSTM (Lazy.WriterT w m) where


instance (Monoid w, MonadInspectSTM m) => MonadInspectSTM (Lazy.WriterT w m) where
type InspectMonad (Lazy.WriterT w m) = InspectMonad m
type InspectMonadSTM (Lazy.WriterT w m) = InspectMonadSTM m
inspectTVar _ = inspectTVar (Proxy @m)
inspectTMVar _ = inspectTMVar (Proxy @m)

Expand Down Expand Up @@ -345,7 +345,7 @@ instance (Monoid w, MonadSTM m) => MonadSTM (Strict.WriterT w m) where


instance (Monoid w, MonadInspectSTM m) => MonadInspectSTM (Strict.WriterT w m) where
type InspectMonad (Strict.WriterT w m) = InspectMonad m
type InspectMonadSTM (Strict.WriterT w m) = InspectMonadSTM m
inspectTVar _ = inspectTVar (Proxy @m)
inspectTMVar _ = inspectTMVar (Proxy @m)

Expand Down Expand Up @@ -436,7 +436,7 @@ instance MonadSTM m => MonadSTM (Lazy.StateT s m) where


instance MonadInspectSTM m => MonadInspectSTM (Lazy.StateT s m) where
type InspectMonad (Lazy.StateT s m) = InspectMonad m
type InspectMonadSTM (Lazy.StateT s m) = InspectMonadSTM m
inspectTVar _ = inspectTVar (Proxy @m)
inspectTMVar _ = inspectTMVar (Proxy @m)

Expand Down Expand Up @@ -527,7 +527,7 @@ instance MonadSTM m => MonadSTM (Strict.StateT s m) where


instance MonadInspectSTM m => MonadInspectSTM (Strict.StateT s m) where
type InspectMonad (Strict.StateT s m) = InspectMonad m
type InspectMonadSTM (Strict.StateT s m) = InspectMonadSTM m
inspectTVar _ = inspectTVar (Proxy @m)
inspectTMVar _ = inspectTMVar (Proxy @m)

Expand Down Expand Up @@ -618,7 +618,7 @@ instance MonadSTM m => MonadSTM (ExceptT e m) where


instance MonadInspectSTM m => MonadInspectSTM (ExceptT e m) where
type InspectMonad (ExceptT e m) = InspectMonad m
type InspectMonadSTM (ExceptT e m) = InspectMonadSTM m
inspectTVar _ = inspectTVar (Proxy @m)
inspectTMVar _ = inspectTMVar (Proxy @m)

Expand Down Expand Up @@ -709,7 +709,7 @@ instance (Monoid w, MonadSTM m) => MonadSTM (Lazy.RWST r w s m) where


instance (Monoid w, MonadInspectSTM m) => MonadInspectSTM (Lazy.RWST r w s m) where
type InspectMonad (Lazy.RWST r w s m) = InspectMonad m
type InspectMonadSTM (Lazy.RWST r w s m) = InspectMonadSTM m
inspectTVar _ = inspectTVar (Proxy @m)
inspectTMVar _ = inspectTMVar (Proxy @m)

Expand Down Expand Up @@ -800,7 +800,7 @@ instance (Monoid w, MonadSTM m) => MonadSTM (Strict.RWST r w s m) where


instance (Monoid w, MonadInspectSTM m) => MonadInspectSTM (Strict.RWST r w s m) where
type InspectMonad (Strict.RWST r w s m) = InspectMonad m
type InspectMonadSTM (Strict.RWST r w s m) = InspectMonadSTM m
inspectTVar _ = inspectTVar (Proxy @m)
inspectTMVar _ = inspectTMVar (Proxy @m)

Expand Down
11 changes: 11 additions & 0 deletions io-classes/src/Control/Concurrent/Class/MonadMVar.hs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ module Control.Concurrent.Class.MonadMVar
( MonadMVar (..)
-- * non-standard extensions
, MonadInspectMVar (..)
, MonadTraceMVar (..)
, MonadLabelledMVar (..)
) where

Expand All @@ -16,6 +17,7 @@ import Control.Monad.Class.MonadThrow
import Control.Monad.Reader (ReaderT (..))
import Control.Monad.Trans (lift)

import Control.Concurrent.Class.MonadSTM (TraceValue)
import Data.Kind (Type)


Expand Down Expand Up @@ -205,6 +207,15 @@ instance MonadInspectMVar IO where
type InspectMVarMonad IO = IO
inspectMVar _ = tryReadMVar

class MonadTraceMVar m where
traceMVarIO :: proxy
-> MVar m a
-> (Maybe (Maybe a) -> Maybe a -> InspectMVarMonad m TraceValue)
-> m ()

instance MonadTraceMVar IO where
traceMVarIO = \_ _ _ -> pure ()

-- | Labelled `MVar`s
--
-- The `IO` instances is no-op, the `IOSim` instance enhances simulation trace.
Expand Down
50 changes: 25 additions & 25 deletions io-classes/src/Control/Monad/Class/MonadSTM/Internal.hs
Original file line number Diff line number Diff line change
Expand Up @@ -372,21 +372,21 @@ class MonadSTM m
-- to access a 'TVar' in the underlying 'ST' monad.
--
class ( MonadSTM m
, Monad (InspectMonad m)
, Monad (InspectMonadSTM m)
)
=> MonadInspectSTM m where
type InspectMonad m :: Type -> Type
type InspectMonadSTM m :: Type -> Type
-- | Return the value of a `TVar` as an `InspectMonad` computation.
--
-- `inspectTVar` is useful if the value of a `TVar` observed by `traceTVar`
-- contains other `TVar`s.
inspectTVar :: proxy m -> TVar m a -> InspectMonad m a
inspectTVar :: proxy m -> TVar m a -> InspectMonadSTM m a
-- | Return the value of a `TMVar` as an `InspectMonad` computation.
inspectTMVar :: proxy m -> TMVar m a -> InspectMonad m (Maybe a)
inspectTMVar :: proxy m -> TMVar m a -> InspectMonadSTM m (Maybe a)
-- TODO: inspectTQueue, inspectTBQueue

instance MonadInspectSTM IO where
type InspectMonad IO = IO
type InspectMonadSTM IO = IO
inspectTVar _ = readTVarIO
-- issue #3198: tryReadTMVarIO
inspectTMVar _ = atomically . tryReadTMVar
Expand Down Expand Up @@ -454,89 +454,89 @@ class MonadInspectSTM m
--
traceTVar :: proxy m
-> TVar m a
-> (Maybe a -> a -> InspectMonad m TraceValue)
-> (Maybe a -> a -> InspectMonadSTM m TraceValue)
-- ^ callback which receives initial value or 'Nothing' (if it
-- is a newly created 'TVar'), and the committed value.
-> STM m ()


traceTMVar :: proxy m
-> TMVar m a
-> (Maybe (Maybe a) -> (Maybe a) -> InspectMonad m TraceValue)
-> (Maybe (Maybe a) -> (Maybe a) -> InspectMonadSTM m TraceValue)
-> STM m ()

traceTQueue :: proxy m
-> TQueue m a
-> (Maybe [a] -> [a] -> InspectMonad m TraceValue)
-> (Maybe [a] -> [a] -> InspectMonadSTM m TraceValue)
-> STM m ()

traceTBQueue :: proxy m
-> TBQueue m a
-> (Maybe [a] -> [a] -> InspectMonad m TraceValue)
-> (Maybe [a] -> [a] -> InspectMonadSTM m TraceValue)
-> STM m ()

traceTSem :: proxy m
-> TSem m
-> (Maybe Integer -> Integer -> InspectMonad m TraceValue)
-> (Maybe Integer -> Integer -> InspectMonadSTM m TraceValue)
-> STM m ()

default traceTMVar :: TMVar m a ~ TMVarDefault m a
=> proxy m
-> TMVar m a
-> (Maybe (Maybe a) -> (Maybe a) -> InspectMonad m TraceValue)
-> (Maybe (Maybe a) -> Maybe a -> InspectMonadSTM m TraceValue)
-> STM m ()
traceTMVar = traceTMVarDefault

default traceTSem :: TSem m ~ TSemDefault m
=> proxy m
-> TSem m
-> (Maybe Integer -> Integer -> InspectMonad m TraceValue)
-> (Maybe Integer -> Integer -> InspectMonadSTM m TraceValue)
-> STM m ()
traceTSem = traceTSemDefault


traceTVarIO :: TVar m a
-> (Maybe a -> a -> InspectMonad m TraceValue)
-> (Maybe a -> a -> InspectMonadSTM m TraceValue)
-> m ()

traceTMVarIO :: TMVar m a
-> (Maybe (Maybe a) -> (Maybe a) -> InspectMonad m TraceValue)
-> (Maybe (Maybe a) -> Maybe a -> InspectMonadSTM m TraceValue)
-> m ()

traceTQueueIO :: TQueue m a
-> (Maybe [a] -> [a] -> InspectMonad m TraceValue)
-> (Maybe [a] -> [a] -> InspectMonadSTM m TraceValue)
-> m ()

traceTBQueueIO :: TBQueue m a
-> (Maybe [a] -> [a] -> InspectMonad m TraceValue)
-> (Maybe [a] -> [a] -> InspectMonadSTM m TraceValue)
-> m ()

traceTSemIO :: TSem m
-> (Maybe Integer -> Integer -> InspectMonad m TraceValue)
-> (Maybe Integer -> Integer -> InspectMonadSTM m TraceValue)
-> m ()

default traceTVarIO :: TVar m a
-> (Maybe a -> a -> InspectMonad m TraceValue)
-> (Maybe a -> a -> InspectMonadSTM m TraceValue)
-> m ()
traceTVarIO = \v f -> atomically (traceTVar Proxy v f)

default traceTMVarIO :: TMVar m a
-> (Maybe (Maybe a) -> (Maybe a) -> InspectMonad m TraceValue)
-> (Maybe (Maybe a) -> (Maybe a) -> InspectMonadSTM m TraceValue)
-> m ()
traceTMVarIO = \v f -> atomically (traceTMVar Proxy v f)

default traceTQueueIO :: TQueue m a
-> (Maybe [a] -> [a] -> InspectMonad m TraceValue)
-> (Maybe [a] -> [a] -> InspectMonadSTM m TraceValue)
-> m ()
traceTQueueIO = \v f -> atomically (traceTQueue Proxy v f)

default traceTBQueueIO :: TBQueue m a
-> (Maybe [a] -> [a] -> InspectMonad m TraceValue)
-> (Maybe [a] -> [a] -> InspectMonadSTM m TraceValue)
-> m ()
traceTBQueueIO = \v f -> atomically (traceTBQueue Proxy v f)

default traceTSemIO :: TSem m
-> (Maybe Integer -> Integer -> InspectMonad m TraceValue)
-> (Maybe Integer -> Integer -> InspectMonadSTM m TraceValue)
-> m ()
traceTSemIO = \v f -> atomically (traceTSem Proxy v f)

Expand Down Expand Up @@ -737,7 +737,7 @@ traceTMVarDefault
:: MonadTraceSTM m
=> proxy m
-> TMVarDefault m a
-> (Maybe (Maybe a) -> Maybe a -> InspectMonad m TraceValue)
-> (Maybe (Maybe a) -> Maybe a -> InspectMonadSTM m TraceValue)
-> STM m ()
traceTMVarDefault p (TMVar t) f = traceTVar p t f

Expand Down Expand Up @@ -1076,7 +1076,7 @@ labelTSemDefault (TSem t) = labelTVar t
traceTSemDefault :: MonadTraceSTM m
=> proxy m
-> TSemDefault m
-> (Maybe Integer -> Integer -> InspectMonad m TraceValue)
-> (Maybe Integer -> Integer -> InspectMonadSTM m TraceValue)
-> STM m ()
traceTSemDefault proxy (TSem t) k = traceTVar proxy t k

Expand Down Expand Up @@ -1295,7 +1295,7 @@ instance MonadSTM m => MonadSTM (ReaderT r m) where
isEmptyTChan = lift . isEmptyTChan

instance MonadInspectSTM m => MonadInspectSTM (ReaderT r m) where
type InspectMonad (ReaderT r m) = InspectMonad m
type InspectMonadSTM (ReaderT r m) = InspectMonadSTM m
inspectTVar _ = inspectTVar (Proxy :: Proxy m)
inspectTMVar _ = inspectTMVar (Proxy :: Proxy m)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,13 +59,13 @@ labelTBQueueIO (StrictTBQueue queue) = Lazy.labelTBQueueIO queue
traceTBQueue :: MonadTraceSTM m
=> proxy m
-> StrictTBQueue m a
-> ((Maybe [a]) -> [a] -> InspectMonad m TraceValue)
-> ((Maybe [a]) -> [a] -> InspectMonadSTM m TraceValue)
-> STM m ()
traceTBQueue p (StrictTBQueue queue) = Lazy.traceTBQueue p queue

traceTBQueueIO :: MonadTraceSTM m
=> StrictTBQueue m a
-> ((Maybe [a]) -> [a] -> InspectMonad m TraceValue)
-> ((Maybe [a]) -> [a] -> InspectMonadSTM m TraceValue)
-> m ()
traceTBQueueIO (StrictTBQueue queue) = Lazy.traceTBQueueIO queue

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ labelTMVarIO v = atomically . labelTMVar v
traceTMVar :: MonadTraceSTM m
=> proxy m
-> StrictTMVar m a
-> (Maybe (Maybe a) -> (Maybe a) -> InspectMonad m TraceValue)
-> (Maybe (Maybe a) -> (Maybe a) -> InspectMonadSTM m TraceValue)
-> STM m ()
traceTMVar p (StrictTMVar var) = Lazy.traceTMVar p var

Expand All @@ -69,7 +69,7 @@ debugTraceTMVar p (StrictTMVar var) = Lazy.debugTraceTMVar p var

traceTMVarIO :: MonadTraceSTM m
=> StrictTMVar m a
-> (Maybe (Maybe a) -> (Maybe a) -> InspectMonad m TraceValue)
-> (Maybe (Maybe a) -> (Maybe a) -> InspectMonadSTM m TraceValue)
-> m ()
traceTMVarIO (StrictTMVar var) = Lazy.traceTMVarIO var

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,13 +56,13 @@ labelTQueueIO (StrictTQueue queue) = Lazy.labelTQueueIO queue
traceTQueue :: MonadTraceSTM m
=> proxy m
-> StrictTQueue m a
-> ((Maybe [a]) -> [a] -> InspectMonad m TraceValue)
-> ((Maybe [a]) -> [a] -> InspectMonadSTM m TraceValue)
-> STM m ()
traceTQueue p (StrictTQueue queue) = Lazy.traceTQueue p queue

traceTQueueIO :: MonadTraceSTM m
=> StrictTQueue m a
-> ((Maybe [a]) -> [a] -> InspectMonad m TraceValue)
-> ((Maybe [a]) -> [a] -> InspectMonadSTM m TraceValue)
-> m ()
traceTQueueIO (StrictTQueue queue) = Lazy.traceTQueueIO queue

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ labelTVarIO v = atomically . labelTVar v
traceTVar :: MonadTraceSTM m
=> proxy m
-> StrictTVar m a
-> (Maybe a -> a -> InspectMonad m TraceValue)
-> (Maybe a -> a -> InspectMonadSTM m TraceValue)
-> STM m ()
traceTVar p StrictTVar {tvar} = Lazy.traceTVar p tvar

Expand All @@ -61,7 +61,7 @@ debugTraceTVar p StrictTVar {tvar} = Lazy.debugTraceTVar p tvar

traceTVarIO :: MonadTraceSTM m
=> StrictTVar m a
-> (Maybe a -> a -> InspectMonad m TraceValue)
-> (Maybe a -> a -> InspectMonadSTM m TraceValue)
-> m ()
traceTVarIO StrictTVar {tvar} = Lazy.traceTVarIO tvar

Expand Down
2 changes: 2 additions & 0 deletions io-sim/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

## next version

- Provided `MonadTraceMVar`
- Renamed `InspectMonad` to `InspectMonadSTM`
- Support `threadLabel` (`io-classes-1.8`)
- `IOSimPOR`'s `Effect` traces now will correctly show labels on read/written
`TVars`.
Expand Down
4 changes: 2 additions & 2 deletions io-sim/src/Control/Monad/IOSim/STM.hs
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ traceTQueueDefault
:: MonadTraceSTM m
=> proxy m
-> TQueueDefault m a
-> (Maybe [a] -> [a] -> InspectMonad m TraceValue)
-> (Maybe [a] -> [a] -> InspectMonadSTM m TraceValue)
-> STM m ()
traceTQueueDefault p (TQueue queue) f =
traceTVar p queue
Expand Down Expand Up @@ -122,7 +122,7 @@ traceTBQueueDefault
:: MonadTraceSTM m
=> proxy m
-> TBQueueDefault m a
-> (Maybe [a] -> [a] -> InspectMonad m TraceValue)
-> (Maybe [a] -> [a] -> InspectMonadSTM m TraceValue)
-> STM m ()
traceTBQueueDefault p (TBQueue queue _size) f =
traceTVar p queue (\mas as -> f (g <$> mas) (g as))
Expand Down
Loading
Loading