Copyright | (C) 2015 Edward Kmett and Ted Cooper |
---|---|
License | BSD-style (see the file LICENSE) |
Maintainer | Edward Kmett <[email protected]> Ted Cooper <[email protected]> |
Stability | experimental |
Portability | non-portable |
Safe Haskell | Trustworthy |
Language | Haskell2010 |
Control.Concurrent.RCU.QSBR
Contents
Description
Quiescent-State-Based Reclamation
Synopsis
- data SRef s a
- data RCU s a
- runRCU :: (forall s. RCU s a) -> IO a
- class Monad m => MonadNew (s :: Type -> Type) (m :: Type -> Type) | m -> s where
- newSRef :: a -> m (s a)
- class MonadNew s m => MonadReading (s :: Type -> Type) (m :: Type -> Type) | m -> s where
- readSRef :: s a -> m a
- class MonadReading s m => MonadWriting (s :: Type -> Type) (m :: Type -> Type) | m -> s where
- writeSRef :: s a -> a -> m ()
- synchronize :: m ()
- class (MonadReading s (Reading m), MonadWriting s (Writing m), MonadNew s m) => MonadRCU (s :: Type -> Type) (m :: Type -> Type) | m -> s where
- data ReadingRCU s a
- data WritingRCU s a
- data RCUThread s a
Documentation
Shared references
Instances
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.
Instances
MonadIO (RCU s) Source # | |||||||||||||
Defined in Control.Concurrent.RCU.QSBR.Internal | |||||||||||||
Applicative (RCU s) Source # | |||||||||||||
Functor (RCU s) Source # | |||||||||||||
Monad (RCU s) Source # | |||||||||||||
MonadNew (SRef s) (RCU s) Source # | |||||||||||||
MonadRCU (SRef s) (RCU s) Source # | |||||||||||||
Defined in Control.Concurrent.RCU.QSBR.Internal Associated Types
| |||||||||||||
type Reading (RCU s) Source # | |||||||||||||
Defined in Control.Concurrent.RCU.QSBR.Internal | |||||||||||||
type Thread (RCU s) Source # | |||||||||||||
Defined in Control.Concurrent.RCU.QSBR.Internal | |||||||||||||
type Writing (RCU s) Source # | |||||||||||||
Defined in Control.Concurrent.RCU.QSBR.Internal |
class Monad m => MonadNew (s :: Type -> Type) (m :: Type -> Type) | m -> s where Source #
Minimal complete definition
Nothing
Instances
MonadNew s m => MonadNew s (MaybeT m) Source # | |
Defined in Control.Concurrent.RCU.Class | |
MonadNew s m => MonadNew s (ExceptT e m) Source # | |
Defined in Control.Concurrent.RCU.Class | |
MonadNew s m => MonadNew s (IdentityT m) Source # | |
Defined in Control.Concurrent.RCU.Class | |
MonadNew s m => MonadNew s (ReaderT e m) Source # | |
Defined in Control.Concurrent.RCU.Class | |
(MonadNew s m, Monoid w) => MonadNew s (WriterT w m) Source # | |
Defined in Control.Concurrent.RCU.Class | |
(MonadNew s m, Monoid w) => MonadNew s (WriterT w m) Source # | |
Defined in Control.Concurrent.RCU.Class | |
MonadNew s' m => MonadNew s' (StateT s m) Source # | |
Defined in Control.Concurrent.RCU.Class | |
MonadNew s' m => MonadNew s' (StateT s m) Source # | |
Defined in Control.Concurrent.RCU.Class | |
(MonadNew s' m, Monoid w) => MonadNew s' (RWST r w s m) Source # | |
Defined in Control.Concurrent.RCU.Class | |
(MonadNew s' m, Monoid w) => MonadNew s' (RWST r w s m) Source # | |
Defined in Control.Concurrent.RCU.Class | |
MonadNew (SRef s) (RCU s) Source # | |
MonadNew (SRef s) (ReadingRCU s) Source # | |
Defined in Control.Concurrent.RCU.GC.Internal Methods newSRef :: a -> ReadingRCU s (SRef s a) Source # | |
MonadNew (SRef s) (WritingRCU s) Source # | |
Defined in Control.Concurrent.RCU.GC.Internal Methods newSRef :: a -> WritingRCU s (SRef s a) Source # | |
MonadNew (SRef s) (RCU s) Source # | |
MonadNew (SRef s) (ReadingRCU s) Source # | |
Defined in Control.Concurrent.RCU.QSBR.Internal Methods newSRef :: a -> ReadingRCU s (SRef s a) Source # | |
MonadNew (SRef s) (WritingRCU s) Source # | |
Defined in Control.Concurrent.RCU.QSBR.Internal Methods newSRef :: a -> WritingRCU s (SRef s a) Source # |
class MonadNew s m => MonadReading (s :: Type -> Type) (m :: Type -> Type) | m -> s where Source #
This is a read-side critical section
Minimal complete definition
Nothing
Instances
MonadReading s m => MonadReading s (MaybeT m) Source # | |
Defined in Control.Concurrent.RCU.Class | |
MonadReading s m => MonadReading s (ExceptT e m) Source # | |
Defined in Control.Concurrent.RCU.Class | |
MonadReading s m => MonadReading s (IdentityT m) Source # | |
Defined in Control.Concurrent.RCU.Class | |
MonadReading s m => MonadReading s (ReaderT e m) Source # | |
Defined in Control.Concurrent.RCU.Class | |
(MonadReading s m, Monoid w) => MonadReading s (WriterT w m) Source # | |
Defined in Control.Concurrent.RCU.Class | |
(MonadReading s m, Monoid w) => MonadReading s (WriterT w m) Source # | |
Defined in Control.Concurrent.RCU.Class | |
MonadReading s' m => MonadReading s' (StateT s m) Source # | |
Defined in Control.Concurrent.RCU.Class | |
MonadReading s' m => MonadReading s' (StateT s m) Source # | |
Defined in Control.Concurrent.RCU.Class | |
(MonadReading s' m, Monoid w) => MonadReading s' (RWST r w s m) Source # | |
Defined in Control.Concurrent.RCU.Class | |
(MonadReading s' m, Monoid w) => MonadReading s' (RWST r w s m) Source # | |
Defined in Control.Concurrent.RCU.Class | |
MonadReading (SRef s) (ReadingRCU s) Source # | |
Defined in Control.Concurrent.RCU.GC.Internal Methods readSRef :: SRef s a -> ReadingRCU s a Source # | |
MonadReading (SRef s) (WritingRCU s) Source # | |
Defined in Control.Concurrent.RCU.GC.Internal Methods readSRef :: SRef s a -> WritingRCU s a Source # | |
MonadReading (SRef s) (ReadingRCU s) Source # | |
Defined in Control.Concurrent.RCU.QSBR.Internal Methods readSRef :: SRef s a -> ReadingRCU s a Source # | |
MonadReading (SRef s) (WritingRCU s) Source # | |
Defined in Control.Concurrent.RCU.QSBR.Internal Methods readSRef :: SRef s a -> WritingRCU s a Source # |
class MonadReading s m => MonadWriting (s :: Type -> Type) (m :: Type -> Type) | m -> s where Source #
This is a write-side critical section
Minimal complete definition
Nothing
Methods
writeSRef :: s a -> a -> m () Source #
Write to a shared reference.
default writeSRef :: forall (t :: (Type -> Type) -> Type -> Type) (n :: Type -> Type) a. (m ~ t n, MonadTrans t, MonadWriting s n) => s a -> a -> m () Source #
synchronize :: m () Source #
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!
default synchronize :: forall (t :: (Type -> Type) -> Type -> Type) (n :: Type -> Type). (m ~ t n, MonadTrans t, MonadWriting s n) => m () Source #
Instances
MonadWriting s m => MonadWriting s (MaybeT m) Source # | |
Defined in Control.Concurrent.RCU.Class | |
MonadWriting s m => MonadWriting s (ExceptT e m) Source # | |
Defined in Control.Concurrent.RCU.Class | |
MonadWriting s m => MonadWriting s (IdentityT m) Source # | |
Defined in Control.Concurrent.RCU.Class | |
MonadWriting s m => MonadWriting s (ReaderT e m) Source # | |
Defined in Control.Concurrent.RCU.Class | |
(MonadWriting s m, Monoid w) => MonadWriting s (WriterT w m) Source # | |
Defined in Control.Concurrent.RCU.Class | |
(MonadWriting s m, Monoid w) => MonadWriting s (WriterT w m) Source # | |
Defined in Control.Concurrent.RCU.Class | |
MonadWriting s' m => MonadWriting s' (StateT s m) Source # | |
Defined in Control.Concurrent.RCU.Class | |
MonadWriting s' m => MonadWriting s' (StateT s m) Source # | |
Defined in Control.Concurrent.RCU.Class | |
(MonadWriting s' m, Monoid w) => MonadWriting s' (RWST r w s m) Source # | |
Defined in Control.Concurrent.RCU.Class | |
(MonadWriting s' m, Monoid w) => MonadWriting s' (RWST r w s m) Source # | |
Defined in Control.Concurrent.RCU.Class | |
MonadWriting (SRef s) (WritingRCU s) Source # | |
Defined in Control.Concurrent.RCU.GC.Internal Methods writeSRef :: SRef s a -> a -> WritingRCU s () Source # synchronize :: WritingRCU s () Source # | |
MonadWriting (SRef s) (WritingRCU s) Source # | |
Defined in Control.Concurrent.RCU.QSBR.Internal Methods writeSRef :: SRef s a -> a -> WritingRCU s () Source # synchronize :: WritingRCU s () Source # |
class (MonadReading s (Reading m), MonadWriting s (Writing m), MonadNew s m) => MonadRCU (s :: Type -> Type) (m :: Type -> Type) | m -> s where Source #
This is the executor service that can fork, join and execute critical sections.
Associated Types
type Reading (m :: Type -> Type) :: Type -> Type Source #
A read-side critical section
type Writing (m :: Type -> Type) :: Type -> Type Source #
A write-side critical section
type Thread (m :: Type -> Type) :: Type -> Type Source #
Threads we can fork and join
Methods
forking :: m a -> m (Thread m a) Source #
Fork a thread
joining :: Thread m a -> m a Source #
Join a thread
reading :: Reading m a -> m a Source #
Run a read-side critical section
writing :: Writing m a -> m a Source #
Run a write-side critical section
Instances
MonadRCU s m => MonadRCU s (MaybeT m) Source # | |||||||||||||
Defined in Control.Concurrent.RCU.Class Associated Types
| |||||||||||||
MonadRCU s m => MonadRCU s (ExceptT e m) Source # | |||||||||||||
Defined in Control.Concurrent.RCU.Class Associated Types
| |||||||||||||
MonadRCU s m => MonadRCU s (IdentityT m) Source # | |||||||||||||
Defined in Control.Concurrent.RCU.Class Associated Types
| |||||||||||||
MonadRCU s m => MonadRCU s (ReaderT e m) Source # | |||||||||||||
Defined in Control.Concurrent.RCU.Class Associated Types
| |||||||||||||
(MonadRCU s m, Monoid e) => MonadRCU s (WriterT e m) Source # | |||||||||||||
Defined in Control.Concurrent.RCU.Class Associated Types
| |||||||||||||
(MonadRCU s m, Monoid e) => MonadRCU s (WriterT e m) Source # | |||||||||||||
Defined in Control.Concurrent.RCU.Class Associated Types
| |||||||||||||
MonadRCU (SRef s) (RCU s) Source # | |||||||||||||
Defined in Control.Concurrent.RCU.GC.Internal Associated Types
| |||||||||||||
MonadRCU (SRef s) (RCU s) Source # | |||||||||||||
Defined in Control.Concurrent.RCU.QSBR.Internal Associated Types
|
Implementation Details
data ReadingRCU s a Source #
This is the basic read-side critical section for an RCU computation
Instances
MonadFail (ReadingRCU s) Source # | |
Defined in Control.Concurrent.RCU.QSBR.Internal Methods fail :: String -> ReadingRCU s a # | |
Alternative (ReadingRCU s) Source # | |
Defined in Control.Concurrent.RCU.QSBR.Internal Methods empty :: ReadingRCU s a # (<|>) :: ReadingRCU s a -> ReadingRCU s a -> ReadingRCU s a # some :: ReadingRCU s a -> ReadingRCU s [a] # many :: ReadingRCU s a -> ReadingRCU s [a] # | |
Applicative (ReadingRCU s) Source # | |
Defined in Control.Concurrent.RCU.QSBR.Internal Methods pure :: a -> ReadingRCU s a # (<*>) :: ReadingRCU s (a -> b) -> ReadingRCU s a -> ReadingRCU s b # liftA2 :: (a -> b -> c) -> ReadingRCU s a -> ReadingRCU s b -> ReadingRCU s c # (*>) :: ReadingRCU s a -> ReadingRCU s b -> ReadingRCU s b # (<*) :: ReadingRCU s a -> ReadingRCU s b -> ReadingRCU s a # | |
Functor (ReadingRCU s) Source # | |
Defined in Control.Concurrent.RCU.QSBR.Internal Methods fmap :: (a -> b) -> ReadingRCU s a -> ReadingRCU s b # (<$) :: a -> ReadingRCU s b -> ReadingRCU s a # | |
Monad (ReadingRCU s) Source # | |
Defined in Control.Concurrent.RCU.QSBR.Internal Methods (>>=) :: ReadingRCU s a -> (a -> ReadingRCU s b) -> ReadingRCU s b # (>>) :: ReadingRCU s a -> ReadingRCU s b -> ReadingRCU s b # return :: a -> ReadingRCU s a # | |
MonadPlus (ReadingRCU s) Source # | |
Defined in Control.Concurrent.RCU.QSBR.Internal | |
MonadNew (SRef s) (ReadingRCU s) Source # | |
Defined in Control.Concurrent.RCU.QSBR.Internal Methods newSRef :: a -> ReadingRCU s (SRef s a) Source # | |
MonadReading (SRef s) (ReadingRCU s) Source # | |
Defined in Control.Concurrent.RCU.QSBR.Internal Methods readSRef :: SRef s a -> ReadingRCU s a Source # |
data WritingRCU s a Source #
This is the basic write-side critical section for an RCU computation
Instances
MonadFail (WritingRCU s) Source # | |
Defined in Control.Concurrent.RCU.QSBR.Internal Methods fail :: String -> WritingRCU s a # | |
Alternative (WritingRCU s) Source # | |
Defined in Control.Concurrent.RCU.QSBR.Internal Methods empty :: WritingRCU s a # (<|>) :: WritingRCU s a -> WritingRCU s a -> WritingRCU s a # some :: WritingRCU s a -> WritingRCU s [a] # many :: WritingRCU s a -> WritingRCU s [a] # | |
Applicative (WritingRCU s) Source # | |
Defined in Control.Concurrent.RCU.QSBR.Internal Methods pure :: a -> WritingRCU s a # (<*>) :: WritingRCU s (a -> b) -> WritingRCU s a -> WritingRCU s b # liftA2 :: (a -> b -> c) -> WritingRCU s a -> WritingRCU s b -> WritingRCU s c # (*>) :: WritingRCU s a -> WritingRCU s b -> WritingRCU s b # (<*) :: WritingRCU s a -> WritingRCU s b -> WritingRCU s a # | |
Functor (WritingRCU s) Source # | |
Defined in Control.Concurrent.RCU.QSBR.Internal Methods fmap :: (a -> b) -> WritingRCU s a -> WritingRCU s b # (<$) :: a -> WritingRCU s b -> WritingRCU s a # | |
Monad (WritingRCU s) Source # | |
Defined in Control.Concurrent.RCU.QSBR.Internal Methods (>>=) :: WritingRCU s a -> (a -> WritingRCU s b) -> WritingRCU s b # (>>) :: WritingRCU s a -> WritingRCU s b -> WritingRCU s b # return :: a -> WritingRCU s a # | |
MonadPlus (WritingRCU s) Source # | |
Defined in Control.Concurrent.RCU.QSBR.Internal | |
MonadNew (SRef s) (WritingRCU s) Source # | |
Defined in Control.Concurrent.RCU.QSBR.Internal Methods newSRef :: a -> WritingRCU s (SRef s a) Source # | |
MonadReading (SRef s) (WritingRCU s) Source # | |
Defined in Control.Concurrent.RCU.QSBR.Internal Methods readSRef :: SRef s a -> WritingRCU s a Source # | |
MonadWriting (SRef s) (WritingRCU s) Source # | |
Defined in Control.Concurrent.RCU.QSBR.Internal Methods writeSRef :: SRef s a -> a -> WritingRCU s () Source # synchronize :: WritingRCU s () Source # |