stm-io-hooks-0.5.4: An STM monad with IO hooksSource codeContentsIndex
Control.Concurrent.AdvSTM
Portabilitynon-portable (requires STM)
Stabilityexperimental
MaintainerPeter Robinson <robinson@ecs.tuwien.ac.at>
Contents
Class MonadAdvSTM
Monad AdvSTM
Description
Extends Control.Concurrent.STM with IO hooks
Synopsis
class Monad m => MonadAdvSTM m where
onCommit :: IO () -> m ()
unsafeRetryWith :: IO () -> m b
orElse :: m a -> m a -> m a
retry :: m a
check :: Bool -> m ()
alwaysSucceeds :: m a -> m ()
always :: m Bool -> m ()
catchSTM :: Exception e => m a -> (e -> m a) -> m a
liftAdv :: STM a -> m a
readTVar :: TVar a -> m a
writeTVar :: TVar a -> a -> m ()
newTVar :: a -> m (TVar a)
data AdvSTM a
atomically :: AdvSTM a -> IO a
unsafeIOToAdvSTM :: IO a -> AdvSTM a
handleSTM :: (MonadAdvSTM m, Exception e) => (e -> m a) -> m a -> m a
debugAdvSTM :: String -> Int -> AdvSTM ()
debugMode :: Bool -> AdvSTM ()
Class MonadAdvSTM
class Monad m => MonadAdvSTM m whereSource
A type class for extended-STM monads. For a concrete instantiation see AdvSTM
Methods
onCommit :: IO () -> m ()Source

Takes an IO action that will be executed iff the transaction commits.

  • When a TVar was modified in a transaction and this transaction commits, this update remains invisible to other threads until the corresponding onCommit action was run.
  • If the onCommit action throws an exception, the original value of the TVars will be restored.
  • Accessing a modified TVar within the onCommit action will cause a Deadlock exception to be thrown.

As a general rule, onCommit should only be used for "real" (i.e. without atomic blocks) IO actions and is certainly not the right place to fiddle with TVars. For example, if you wanted to write a TVar value to a file on commit, you could write:

 tvar <- newTVarIO "bla"
 atomically $ do 
    x <- readTVar tvar 
    onCommit (writeFile "myfile" x)
unsafeRetryWith :: IO () -> m bSource
Retries the transaction and uses unsafeIOToSTM to fork off a thread that runs the given IO action. Since a transaction might be rerun several times by the runtime system, it is your responsibility to ensure that the IO-action is idempotent and releases all acquired locks.
orElse :: m a -> m a -> m aSource
See orElse
retry :: m aSource
See retry
check :: Bool -> m ()Source
See check
alwaysSucceeds :: m a -> m ()Source
See alwaysSucceeds
always :: m Bool -> m ()Source
See always
catchSTM :: Exception e => m a -> (e -> m a) -> m aSource
See catchSTM
liftAdv :: STM a -> m aSource
Lifts STM actions to MonadAdvSTM.
readTVar :: TVar a -> m aSource
Reads a value from a TVar. Blocks until the IO onCommit action(s) of the corresponding transaction are complete. See onCommit for a more detailed description of this behaviour.
writeTVar :: TVar a -> a -> m ()Source
Writes a value to a TVar. Blocks until the onCommit IO-action(s) are complete. See onCommit for details.
newTVar :: a -> m (TVar a)Source
See newTVar
show/hide Instances
Monad AdvSTM
data AdvSTM a Source
Drop-in replacement for the STM monad
show/hide Instances
atomically :: AdvSTM a -> IO aSource
See atomically
unsafeIOToAdvSTM :: IO a -> AdvSTM aSource
See unsafeIOToSTM
handleSTM :: (MonadAdvSTM m, Exception e) => (e -> m a) -> m a -> m aSource
A version of catchSTM with the arguments swapped around.
debugAdvSTM :: String -> Int -> AdvSTM ()Source
Uses unsafeIOToSTM to output the Thread Id and a message and delays for a given number of time. WARNING: Can lead to deadlocks!
debugMode :: Bool -> AdvSTM ()Source
Switches the debug mode on or off. WARNING: Can lead to deadlocks!
Produced by Haddock version 2.4.2