-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Read-Copy-Update for Haskell -- -- Read-Copy-Update for Haskell @package rcu @version 0.2 module Control.Concurrent.RCU.Class class Monad m => MonadNew s m | m -> s where newSRef a = lift (newSRef a) -- | Build a new shared reference newSRef :: MonadNew s m => a -> m (s a) -- | Build a new shared reference newSRef :: (MonadNew s m, m ~ t n, MonadTrans t, MonadNew s n) => a -> m (s a) -- | This is a read-side critical section class MonadNew s m => MonadReading s m | m -> s where readSRef r = lift (readSRef r) -- | Read a shared reference. readSRef :: MonadReading s m => s a -> m a -- | Read a shared reference. readSRef :: (MonadReading s m, m ~ t n, MonadTrans t, MonadReading s n) => 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 -- | Write to a shared reference. writeSRef :: MonadWriting s m => s a -> a -> m () -- | Write to a shared reference. writeSRef :: (MonadWriting s m, m ~ t n, MonadTrans t, MonadWriting s n) => s a -> a -> m () -- | Synchronize with other writers. -- -- No other writer can straddle this time bound. It will either see -- writes from before, or writes after, but never some of both! synchronize :: MonadWriting s m => m () -- | Synchronize with other writers. -- -- No other writer can straddle this time bound. It will either see -- writes from before, or writes after, but never some of both! synchronize :: (MonadWriting s m, m ~ t n, MonadTrans t, MonadWriting s n) => 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 Reading m :: * -> * type Writing m :: * -> * type Thread m :: * -> * where { type family Reading m :: * -> *; type family Writing m :: * -> *; type family Thread m :: * -> *; } -- | Fork a thread forking :: MonadRCU s m => m a -> m (Thread m a) -- | Join a thread joining :: MonadRCU s m => Thread m a -> m a -- | Run a read-side critical section reading :: MonadRCU s m => Reading m a -> m a -- | Run a write-side critical section writing :: MonadRCU s m => Writing m a -> m a -- | Copy a shared reference. copySRef :: MonadReading s m => s a -> m (s a) instance Control.Concurrent.RCU.Class.MonadNew s m => Control.Concurrent.RCU.Class.MonadNew s (Control.Monad.Trans.Reader.ReaderT e m) instance (Control.Concurrent.RCU.Class.MonadNew s m, GHC.Base.Monoid w) => Control.Concurrent.RCU.Class.MonadNew s (Control.Monad.Trans.Writer.Strict.WriterT w m) instance (Control.Concurrent.RCU.Class.MonadNew s m, GHC.Base.Monoid w) => Control.Concurrent.RCU.Class.MonadNew s (Control.Monad.Trans.Writer.Lazy.WriterT w m) instance Control.Concurrent.RCU.Class.MonadNew s' m => Control.Concurrent.RCU.Class.MonadNew s' (Control.Monad.Trans.State.Strict.StateT s m) instance Control.Concurrent.RCU.Class.MonadNew s' m => Control.Concurrent.RCU.Class.MonadNew s' (Control.Monad.Trans.State.Lazy.StateT s m) instance (Control.Concurrent.RCU.Class.MonadNew s' m, GHC.Base.Monoid w) => Control.Concurrent.RCU.Class.MonadNew s' (Control.Monad.Trans.RWS.Strict.RWST r w s m) instance (Control.Concurrent.RCU.Class.MonadNew s' m, GHC.Base.Monoid w) => Control.Concurrent.RCU.Class.MonadNew s' (Control.Monad.Trans.RWS.Lazy.RWST r w s m) instance Control.Concurrent.RCU.Class.MonadNew s m => Control.Concurrent.RCU.Class.MonadNew s (Control.Monad.Trans.Except.ExceptT e m) instance Control.Concurrent.RCU.Class.MonadNew s m => Control.Concurrent.RCU.Class.MonadNew s (Control.Monad.Trans.Maybe.MaybeT m) instance Control.Concurrent.RCU.Class.MonadNew s m => Control.Concurrent.RCU.Class.MonadNew s (Control.Monad.Trans.Identity.IdentityT m) instance Control.Concurrent.RCU.Class.MonadReading s m => Control.Concurrent.RCU.Class.MonadReading s (Control.Monad.Trans.Reader.ReaderT e m) instance (Control.Concurrent.RCU.Class.MonadReading s m, GHC.Base.Monoid w) => Control.Concurrent.RCU.Class.MonadReading s (Control.Monad.Trans.Writer.Strict.WriterT w m) instance (Control.Concurrent.RCU.Class.MonadReading s m, GHC.Base.Monoid w) => Control.Concurrent.RCU.Class.MonadReading s (Control.Monad.Trans.Writer.Lazy.WriterT w m) instance Control.Concurrent.RCU.Class.MonadReading s' m => Control.Concurrent.RCU.Class.MonadReading s' (Control.Monad.Trans.State.Strict.StateT s m) instance Control.Concurrent.RCU.Class.MonadReading s' m => Control.Concurrent.RCU.Class.MonadReading s' (Control.Monad.Trans.State.Lazy.StateT s m) instance (Control.Concurrent.RCU.Class.MonadReading s' m, GHC.Base.Monoid w) => Control.Concurrent.RCU.Class.MonadReading s' (Control.Monad.Trans.RWS.Strict.RWST r w s m) instance (Control.Concurrent.RCU.Class.MonadReading s' m, GHC.Base.Monoid w) => Control.Concurrent.RCU.Class.MonadReading s' (Control.Monad.Trans.RWS.Lazy.RWST r w s m) instance Control.Concurrent.RCU.Class.MonadReading s m => Control.Concurrent.RCU.Class.MonadReading s (Control.Monad.Trans.Except.ExceptT e m) instance Control.Concurrent.RCU.Class.MonadReading s m => Control.Concurrent.RCU.Class.MonadReading s (Control.Monad.Trans.Maybe.MaybeT m) instance Control.Concurrent.RCU.Class.MonadReading s m => Control.Concurrent.RCU.Class.MonadReading s (Control.Monad.Trans.Identity.IdentityT m) instance Control.Concurrent.RCU.Class.MonadWriting s m => Control.Concurrent.RCU.Class.MonadWriting s (Control.Monad.Trans.Reader.ReaderT e m) instance (Control.Concurrent.RCU.Class.MonadWriting s m, GHC.Base.Monoid w) => Control.Concurrent.RCU.Class.MonadWriting s (Control.Monad.Trans.Writer.Strict.WriterT w m) instance (Control.Concurrent.RCU.Class.MonadWriting s m, GHC.Base.Monoid w) => Control.Concurrent.RCU.Class.MonadWriting s (Control.Monad.Trans.Writer.Lazy.WriterT w m) instance Control.Concurrent.RCU.Class.MonadWriting s' m => Control.Concurrent.RCU.Class.MonadWriting s' (Control.Monad.Trans.State.Strict.StateT s m) instance Control.Concurrent.RCU.Class.MonadWriting s' m => Control.Concurrent.RCU.Class.MonadWriting s' (Control.Monad.Trans.State.Lazy.StateT s m) instance (Control.Concurrent.RCU.Class.MonadWriting s' m, GHC.Base.Monoid w) => Control.Concurrent.RCU.Class.MonadWriting s' (Control.Monad.Trans.RWS.Strict.RWST r w s m) instance (Control.Concurrent.RCU.Class.MonadWriting s' m, GHC.Base.Monoid w) => Control.Concurrent.RCU.Class.MonadWriting s' (Control.Monad.Trans.RWS.Lazy.RWST r w s m) instance Control.Concurrent.RCU.Class.MonadWriting s m => Control.Concurrent.RCU.Class.MonadWriting s (Control.Monad.Trans.Identity.IdentityT m) instance Control.Concurrent.RCU.Class.MonadWriting s m => Control.Concurrent.RCU.Class.MonadWriting s (Control.Monad.Trans.Except.ExceptT e m) instance Control.Concurrent.RCU.Class.MonadWriting s m => Control.Concurrent.RCU.Class.MonadWriting s (Control.Monad.Trans.Maybe.MaybeT m) instance Control.Concurrent.RCU.Class.MonadRCU s m => Control.Concurrent.RCU.Class.MonadRCU s (Control.Monad.Trans.Reader.ReaderT e m) instance Control.Concurrent.RCU.Class.MonadRCU s m => Control.Concurrent.RCU.Class.MonadRCU s (Control.Monad.Trans.Identity.IdentityT m) instance Control.Concurrent.RCU.Class.MonadRCU s m => Control.Concurrent.RCU.Class.MonadRCU s (Control.Monad.Trans.Except.ExceptT e m) instance Control.Concurrent.RCU.Class.MonadRCU s m => Control.Concurrent.RCU.Class.MonadRCU s (Control.Monad.Trans.Maybe.MaybeT m) instance (Control.Concurrent.RCU.Class.MonadRCU s m, GHC.Base.Monoid e) => Control.Concurrent.RCU.Class.MonadRCU s (Control.Monad.Trans.Writer.Strict.WriterT e m) instance (Control.Concurrent.RCU.Class.MonadRCU s m, GHC.Base.Monoid e) => Control.Concurrent.RCU.Class.MonadRCU s (Control.Monad.Trans.Writer.Lazy.WriterT e m) -- | QSBR-based RCU module Control.Concurrent.RCU.GC.Internal -- | Shared references newtype SRef s a SRef :: IORef a -> SRef s a [unSRef] :: SRef s a -> IORef 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. Writers are serialized using an MVar, -- readers are able to proceed while writers are updating. newtype RCU s a RCU :: (RCUState -> IO a) -> RCU s a [unRCU] :: RCU s a -> RCUState -> IO a -- | Run an RCU computation. runRCU :: (forall s. RCU s a) -> IO a -- | Run an RCU computation in a thread pinned to a particular core. runOnRCU :: Int -> (forall s. RCU s a) -> IO a -- | This is the basic read-side critical section for an RCU computation newtype ReadingRCU s a ReadingRCU :: (RCUState -> IO a) -> ReadingRCU s a [runReadingRCU] :: ReadingRCU s a -> RCUState -> IO a -- | This is the basic write-side critical section for an RCU computation newtype WritingRCU s a WritingRCU :: (RCUState -> IO a) -> WritingRCU s a [runWritingRCU] :: WritingRCU s a -> RCUState -> IO a -- | State for an RCU computation. data RCUState RCUState :: {-# UNPACK #-} !Counter -> {-# UNPACK #-} !(IORef Version) -> {-# UNPACK #-} !(MVar [Counter]) -> {-# UNPACK #-} !(MVar ()) -> {-# UNPACK #-} !Counter -> !(Maybe Int) -> RCUState -- | Global state [rcuStateGlobalCounter] :: RCUState -> {-# UNPACK #-} !Counter [rcuStateGlobalVersion] :: RCUState -> {-# UNPACK #-} !(IORef Version) [rcuStateThreadCountersV] :: RCUState -> {-# UNPACK #-} !(MVar [Counter]) [rcuStateWriterLockV] :: RCUState -> {-# UNPACK #-} !(MVar ()) -- | Thread state [rcuStateMyCounter] :: RCUState -> {-# UNPACK #-} !Counter [rcuStatePinned] :: RCUState -> !(Maybe Int) instance GHC.Base.Functor (Control.Concurrent.RCU.GC.Internal.RCU s) instance GHC.Base.Functor (Control.Concurrent.RCU.GC.Internal.WritingRCU s) instance GHC.Base.Functor (Control.Concurrent.RCU.GC.Internal.ReadingRCU s) instance GHC.Classes.Eq (Control.Concurrent.RCU.GC.Internal.SRef s a) instance GHC.Classes.Eq Control.Concurrent.RCU.GC.Internal.Counter instance GHC.Base.Applicative (Control.Concurrent.RCU.GC.Internal.ReadingRCU s) instance GHC.Base.Monad (Control.Concurrent.RCU.GC.Internal.ReadingRCU s) instance GHC.Base.Alternative (Control.Concurrent.RCU.GC.Internal.ReadingRCU s) instance GHC.Base.MonadPlus (Control.Concurrent.RCU.GC.Internal.ReadingRCU s) instance Control.Concurrent.RCU.Class.MonadNew (Control.Concurrent.RCU.GC.Internal.SRef s) (Control.Concurrent.RCU.GC.Internal.ReadingRCU s) instance Control.Concurrent.RCU.Class.MonadReading (Control.Concurrent.RCU.GC.Internal.SRef s) (Control.Concurrent.RCU.GC.Internal.ReadingRCU s) instance GHC.Base.Applicative (Control.Concurrent.RCU.GC.Internal.WritingRCU s) instance GHC.Base.Monad (Control.Concurrent.RCU.GC.Internal.WritingRCU s) instance GHC.Base.Alternative (Control.Concurrent.RCU.GC.Internal.WritingRCU s) instance GHC.Base.MonadPlus (Control.Concurrent.RCU.GC.Internal.WritingRCU s) instance Control.Concurrent.RCU.Class.MonadNew (Control.Concurrent.RCU.GC.Internal.SRef s) (Control.Concurrent.RCU.GC.Internal.WritingRCU s) instance Control.Concurrent.RCU.Class.MonadReading (Control.Concurrent.RCU.GC.Internal.SRef s) (Control.Concurrent.RCU.GC.Internal.WritingRCU s) instance Control.Concurrent.RCU.Class.MonadWriting (Control.Concurrent.RCU.GC.Internal.SRef s) (Control.Concurrent.RCU.GC.Internal.WritingRCU s) instance GHC.Base.Applicative (Control.Concurrent.RCU.GC.Internal.RCU s) instance GHC.Base.Monad (Control.Concurrent.RCU.GC.Internal.RCU s) instance Control.Concurrent.RCU.Class.MonadNew (Control.Concurrent.RCU.GC.Internal.SRef s) (Control.Concurrent.RCU.GC.Internal.RCU s) instance Control.Concurrent.RCU.Class.MonadRCU (Control.Concurrent.RCU.GC.Internal.SRef s) (Control.Concurrent.RCU.GC.Internal.RCU s) instance Control.Monad.IO.Class.MonadIO (Control.Concurrent.RCU.GC.Internal.RCU s) -- | Unfenced QSBR w/ Finalizer-Based Fallback Reclamation module Control.Concurrent.RCU.GC -- | 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. Writers are serialized using an MVar, -- readers are able to proceed while writers are updating. 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) -- | Build a new shared reference newSRef :: MonadNew s m => a -> m (s a) -- | Build a new shared reference newSRef :: (MonadNew s m, m ~ t n, MonadTrans t, MonadNew s n) => a -> m (s a) -- | This is a read-side critical section class MonadNew s m => MonadReading s m | m -> s where readSRef r = lift (readSRef r) -- | Read a shared reference. readSRef :: MonadReading s m => s a -> m a -- | Read a shared reference. readSRef :: (MonadReading s m, m ~ t n, MonadTrans t, MonadReading s n) => 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 -- | Write to a shared reference. writeSRef :: MonadWriting s m => s a -> a -> m () -- | Write to a shared reference. writeSRef :: (MonadWriting s m, m ~ t n, MonadTrans t, MonadWriting s n) => s a -> a -> m () -- | Synchronize with other writers. -- -- No other writer can straddle this time bound. It will either see -- writes from before, or writes after, but never some of both! synchronize :: MonadWriting s m => m () -- | Synchronize with other writers. -- -- No other writer can straddle this time bound. It will either see -- writes from before, or writes after, but never some of both! synchronize :: (MonadWriting s m, m ~ t n, MonadTrans t, MonadWriting s n) => 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 Reading m :: * -> * type Writing m :: * -> * type Thread m :: * -> * where { type family Reading m :: * -> *; type family Writing m :: * -> *; type family Thread m :: * -> *; } -- | Fork a thread forking :: MonadRCU s m => m a -> m (Thread m a) -- | Join a thread joining :: MonadRCU s m => Thread m a -> m a -- | Run a read-side critical section reading :: MonadRCU s m => Reading m a -> m a -- | Run a write-side critical section 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 -- | QSBR-based RCU module Control.Concurrent.RCU.QSBR.Internal -- | Shared references newtype SRef s a SRef :: IORef a -> SRef s a [unSRef] :: SRef s a -> IORef 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. Writers are serialized using an MVar, -- readers are able to proceed while writers are updating. newtype RCU s a RCU :: (RCUState -> IO a) -> RCU s a [unRCU] :: RCU s a -> RCUState -> IO a -- | Run an RCU computation. runRCU :: (forall s. RCU s a) -> IO a -- | Run an RCU computation in a thread pinned to a particular core. runOnRCU :: Int -> (forall s. RCU s a) -> IO a -- | This is the basic read-side critical section for an RCU computation newtype ReadingRCU s a ReadingRCU :: (RCUState -> IO a) -> ReadingRCU s a [runReadingRCU] :: ReadingRCU s a -> RCUState -> IO a -- | This is the basic write-side critical section for an RCU computation newtype WritingRCU s a WritingRCU :: (RCUState -> IO a) -> WritingRCU s a [runWritingRCU] :: WritingRCU s a -> RCUState -> IO a -- | State for an RCU computation. data RCUState RCUState :: {-# UNPACK #-} !Counter -> {-# UNPACK #-} !(IORef [Counter]) -> {-# UNPACK #-} !(MVar ()) -> {-# UNPACK #-} !(MVar ()) -> {-# UNPACK #-} !Counter -> !(Maybe Int) -> RCUState -- | Global state [rcuStateGlobalCounter] :: RCUState -> {-# UNPACK #-} !Counter [rcuStateThreadCountersR] :: RCUState -> {-# UNPACK #-} !(IORef [Counter]) [rcuStateThreadCountersLockV] :: RCUState -> {-# UNPACK #-} !(MVar ()) [rcuStateWriterLockV] :: RCUState -> {-# UNPACK #-} !(MVar ()) -- | Thread state [rcuStateMyCounter] :: RCUState -> {-# UNPACK #-} !Counter [rcuStatePinned] :: RCUState -> !(Maybe Int) instance GHC.Base.Functor (Control.Concurrent.RCU.QSBR.Internal.RCU s) instance GHC.Base.Functor (Control.Concurrent.RCU.QSBR.Internal.WritingRCU s) instance GHC.Base.Functor (Control.Concurrent.RCU.QSBR.Internal.ReadingRCU s) instance GHC.Classes.Eq (Control.Concurrent.RCU.QSBR.Internal.SRef s a) instance GHC.Classes.Eq Control.Concurrent.RCU.QSBR.Internal.Counter instance GHC.Base.Applicative (Control.Concurrent.RCU.QSBR.Internal.ReadingRCU s) instance GHC.Base.Monad (Control.Concurrent.RCU.QSBR.Internal.ReadingRCU s) instance GHC.Base.Alternative (Control.Concurrent.RCU.QSBR.Internal.ReadingRCU s) instance GHC.Base.MonadPlus (Control.Concurrent.RCU.QSBR.Internal.ReadingRCU s) instance Control.Concurrent.RCU.Class.MonadNew (Control.Concurrent.RCU.QSBR.Internal.SRef s) (Control.Concurrent.RCU.QSBR.Internal.ReadingRCU s) instance Control.Concurrent.RCU.Class.MonadReading (Control.Concurrent.RCU.QSBR.Internal.SRef s) (Control.Concurrent.RCU.QSBR.Internal.ReadingRCU s) instance GHC.Base.Applicative (Control.Concurrent.RCU.QSBR.Internal.WritingRCU s) instance GHC.Base.Monad (Control.Concurrent.RCU.QSBR.Internal.WritingRCU s) instance GHC.Base.Alternative (Control.Concurrent.RCU.QSBR.Internal.WritingRCU s) instance GHC.Base.MonadPlus (Control.Concurrent.RCU.QSBR.Internal.WritingRCU s) instance Control.Concurrent.RCU.Class.MonadNew (Control.Concurrent.RCU.QSBR.Internal.SRef s) (Control.Concurrent.RCU.QSBR.Internal.WritingRCU s) instance Control.Concurrent.RCU.Class.MonadReading (Control.Concurrent.RCU.QSBR.Internal.SRef s) (Control.Concurrent.RCU.QSBR.Internal.WritingRCU s) instance Control.Concurrent.RCU.Class.MonadWriting (Control.Concurrent.RCU.QSBR.Internal.SRef s) (Control.Concurrent.RCU.QSBR.Internal.WritingRCU s) instance GHC.Base.Applicative (Control.Concurrent.RCU.QSBR.Internal.RCU s) instance GHC.Base.Monad (Control.Concurrent.RCU.QSBR.Internal.RCU s) instance Control.Concurrent.RCU.Class.MonadNew (Control.Concurrent.RCU.QSBR.Internal.SRef s) (Control.Concurrent.RCU.QSBR.Internal.RCU s) instance Control.Concurrent.RCU.Class.MonadRCU (Control.Concurrent.RCU.QSBR.Internal.SRef s) (Control.Concurrent.RCU.QSBR.Internal.RCU s) instance Control.Monad.IO.Class.MonadIO (Control.Concurrent.RCU.QSBR.Internal.RCU s) -- | Quiescent-State-Based Reclamation module Control.Concurrent.RCU.QSBR -- | 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. Writers are serialized using an MVar, -- readers are able to proceed while writers are updating. 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) -- | Build a new shared reference newSRef :: MonadNew s m => a -> m (s a) -- | Build a new shared reference newSRef :: (MonadNew s m, m ~ t n, MonadTrans t, MonadNew s n) => a -> m (s a) -- | This is a read-side critical section class MonadNew s m => MonadReading s m | m -> s where readSRef r = lift (readSRef r) -- | Read a shared reference. readSRef :: MonadReading s m => s a -> m a -- | Read a shared reference. readSRef :: (MonadReading s m, m ~ t n, MonadTrans t, MonadReading s n) => 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 -- | Write to a shared reference. writeSRef :: MonadWriting s m => s a -> a -> m () -- | Write to a shared reference. writeSRef :: (MonadWriting s m, m ~ t n, MonadTrans t, MonadWriting s n) => s a -> a -> m () -- | Synchronize with other writers. -- -- No other writer can straddle this time bound. It will either see -- writes from before, or writes after, but never some of both! synchronize :: MonadWriting s m => m () -- | Synchronize with other writers. -- -- No other writer can straddle this time bound. It will either see -- writes from before, or writes after, but never some of both! synchronize :: (MonadWriting s m, m ~ t n, MonadTrans t, MonadWriting s n) => 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 Reading m :: * -> * type Writing m :: * -> * type Thread m :: * -> * where { type family Reading m :: * -> *; type family Writing m :: * -> *; type family Thread m :: * -> *; } -- | Fork a thread forking :: MonadRCU s m => m a -> m (Thread m a) -- | Join a thread joining :: MonadRCU s m => Thread m a -> m a -- | Run a read-side critical section reading :: MonadRCU s m => Reading m a -> m a -- | Run a write-side critical section 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