-- 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