-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | STM-based Read-Copy-Update -- -- STM-based Read-Copy-Update @package rcu @version 0 -- | STM-based RCU with concurrent writers module Control.Concurrent.RCU.Internal -- | Shared references newtype SRef s a [SRef] :: TVar a -> SRef s a [unSRef] :: SRef s a -> TVar a -- | This is a basic RCU thread. It may be embellished when running -- in a more exotic context. data RCUThread s a [RCUThread] :: {-# UNPACK #-} !ThreadId -> {-# UNPACK #-} !(MVar a) -> RCUThread s a [rcuThreadId] :: RCUThread s a -> {-# UNPACK #-} !ThreadId [rcuThreadVar] :: RCUThread s a -> {-# UNPACK #-} !(MVar a) -- | This is an RCU computation. It can use forking and -- joining to form new threads, and then you can use -- reading and writing to run classic read-side and -- write-side RCU computations. Contention between multiple write-side -- computations is managed by STM. newtype RCU s a [RCU] :: (TVar Int64 -> IO a) -> RCU s a [unRCU] :: RCU s a -> TVar Int64 -> IO a -- | Run an RCU computation. runRCU :: (forall s. RCU s a) -> IO a -- | This is the basic read-side critical section for an RCU computation newtype ReadingRCU s a [ReadingRCU] :: IO a -> ReadingRCU s a [runReadingRCU] :: ReadingRCU s a -> IO a -- | This is the basic write-side critical section for an RCU computation newtype WritingRCU s a [WritingRCU] :: (TVar Int64 -> STM a) -> WritingRCU s a [runWritingRCU] :: WritingRCU s a -> TVar Int64 -> STM a class Monad m => MonadNew s m | m -> s where newSRef a = lift (newSRef a) newSRef :: MonadNew s m => a -> m (SRef s a) -- | This is a read-side critical section class MonadNew s m => MonadReading s m | m -> s where readSRef r = lift (readSRef r) readSRef :: MonadReading s m => SRef s a -> m a -- | Copy a shared reference. copySRef :: MonadReading s m => SRef s a -> m (SRef s a) -- | This is a write-side critical section class MonadReading s m => MonadWriting s m | m -> s where writeSRef r a = lift (writeSRef r a) synchronize = lift synchronize writeSRef :: MonadWriting s m => SRef s a -> a -> m () synchronize :: MonadWriting s m => m () -- | This is the executor service that can fork, join and execute critical -- sections. class (MonadReading s (Reading m), MonadWriting s (Writing m), MonadNew s m) => MonadRCU s m | m -> s where type family Reading m :: * -> * type family Writing m :: * -> * type family Thread m :: * -> * forking :: MonadRCU s m => m a -> m (Thread m a) joining :: MonadRCU s m => Thread m a -> m a reading :: MonadRCU s m => Reading m a -> m a writing :: MonadRCU s m => Writing m a -> m a instance Functor (RCU s) instance Functor (WritingRCU s) instance Monad (ReadingRCU s) instance Applicative (ReadingRCU s) instance Functor (ReadingRCU s) instance Eq (SRef s a) instance MonadNew s m => MonadNew s (ReaderT e m) instance (MonadNew s m, Monoid w) => MonadNew s (WriterT w m) instance (MonadNew s m, Monoid w) => MonadNew s (WriterT w m) instance MonadNew s' m => MonadNew s' (StateT s m) instance MonadNew s' m => MonadNew s' (StateT s m) instance (MonadNew s' m, Monoid w) => MonadNew s' (RWST r w s m) instance (MonadNew s' m, Monoid w) => MonadNew s' (RWST r w s m) instance MonadNew s m => MonadNew s (ExceptT e m) instance MonadNew s m => MonadNew s (MaybeT m) instance MonadNew s m => MonadNew s (IdentityT m) instance MonadReading s m => MonadReading s (ReaderT e m) instance (MonadReading s m, Monoid w) => MonadReading s (WriterT w m) instance (MonadReading s m, Monoid w) => MonadReading s (WriterT w m) instance MonadReading s' m => MonadReading s' (StateT s m) instance MonadReading s' m => MonadReading s' (StateT s m) instance (MonadReading s' m, Monoid w) => MonadReading s' (RWST r w s m) instance (MonadReading s' m, Monoid w) => MonadReading s' (RWST r w s m) instance MonadReading s m => MonadReading s (ExceptT e m) instance MonadReading s m => MonadReading s (MaybeT m) instance MonadReading s m => MonadReading s (IdentityT m) instance MonadWriting s m => MonadWriting s (ReaderT e m) instance (MonadWriting s m, Monoid w) => MonadWriting s (WriterT w m) instance (MonadWriting s m, Monoid w) => MonadWriting s (WriterT w m) instance MonadWriting s m => MonadWriting s (StateT s m) instance MonadWriting s m => MonadWriting s (StateT s m) instance (MonadWriting s m, Monoid w) => MonadWriting s (RWST r w s m) instance (MonadWriting s m, Monoid w) => MonadWriting s (RWST r w s m) instance MonadWriting s m => MonadWriting s (IdentityT m) instance MonadWriting s m => MonadWriting s (ExceptT e m) instance MonadWriting s m => MonadWriting s (MaybeT m) instance MonadRCU s m => MonadRCU s (ReaderT e m) instance MonadRCU s m => MonadRCU s (IdentityT m) instance MonadRCU s m => MonadRCU s (ExceptT e m) instance MonadRCU s m => MonadRCU s (MaybeT m) instance (MonadRCU s m, Monoid e) => MonadRCU s (WriterT e m) instance (MonadRCU s m, Monoid e) => MonadRCU s (WriterT e m) instance MonadNew s (ReadingRCU s) instance MonadReading s (ReadingRCU s) instance Applicative (WritingRCU s) instance Monad (WritingRCU s) instance Alternative (WritingRCU s) instance MonadPlus (WritingRCU s) instance MonadNew s (WritingRCU s) instance MonadReading s (WritingRCU s) instance MonadWriting s (WritingRCU s) instance Applicative (RCU s) instance Monad (RCU s) instance MonadNew s (RCU s) instance MonadRCU s (RCU s) instance MonadIO (RCU s) module Control.Concurrent.RCU.Class -- | Shared references data SRef s a class Monad m => MonadNew s m | m -> s where newSRef a = lift (newSRef a) newSRef :: MonadNew s m => a -> m (SRef s a) -- | This is a read-side critical section class MonadNew s m => MonadReading s m | m -> s where readSRef r = lift (readSRef r) readSRef :: MonadReading s m => SRef s a -> m a -- | This is a write-side critical section class MonadReading s m => MonadWriting s m | m -> s where writeSRef r a = lift (writeSRef r a) synchronize = lift synchronize writeSRef :: MonadWriting s m => SRef s a -> a -> m () synchronize :: MonadWriting s m => m () -- | This is the executor service that can fork, join and execute critical -- sections. class (MonadReading s (Reading m), MonadWriting s (Writing m), MonadNew s m) => MonadRCU s m | m -> s where type family Reading m :: * -> * type family Writing m :: * -> * type family Thread m :: * -> * forking :: MonadRCU s m => m a -> m (Thread m a) joining :: MonadRCU s m => Thread m a -> m a reading :: MonadRCU s m => Reading m a -> m a writing :: MonadRCU s m => Writing m a -> m a module Control.Concurrent.RCU -- | Shared references data SRef s a -- | This is an RCU computation. It can use forking and -- joining to form new threads, and then you can use -- reading and writing to run classic read-side and -- write-side RCU computations. Contention between multiple write-side -- computations is managed by STM. data RCU s a -- | Run an RCU computation. runRCU :: (forall s. RCU s a) -> IO a class Monad m => MonadNew s m | m -> s where newSRef a = lift (newSRef a) newSRef :: MonadNew s m => a -> m (SRef s a) -- | This is a read-side critical section class MonadNew s m => MonadReading s m | m -> s where readSRef r = lift (readSRef r) readSRef :: MonadReading s m => SRef s a -> m a -- | This is a write-side critical section class MonadReading s m => MonadWriting s m | m -> s where writeSRef r a = lift (writeSRef r a) synchronize = lift synchronize writeSRef :: MonadWriting s m => SRef s a -> a -> m () synchronize :: MonadWriting s m => m () -- | This is the executor service that can fork, join and execute critical -- sections. class (MonadReading s (Reading m), MonadWriting s (Writing m), MonadNew s m) => MonadRCU s m | m -> s where type family Reading m :: * -> * type family Writing m :: * -> * type family Thread m :: * -> * forking :: MonadRCU s m => m a -> m (Thread m a) joining :: MonadRCU s m => Thread m a -> m a reading :: MonadRCU s m => Reading m a -> m a writing :: MonadRCU s m => Writing m a -> m a -- | This is the basic read-side critical section for an RCU computation data ReadingRCU s a -- | This is the basic write-side critical section for an RCU computation data WritingRCU s a -- | This is a basic RCU thread. It may be embellished when running -- in a more exotic context. data RCUThread s a