Copyright | © 2009 Galois Inc. © 2018 DFINITY Stiftung |
---|---|
Maintainer | DFINITY USA Research <team@dfinity.org> |
Safe Haskell | None |
Language | Haskell2010 |
Implements bounded channels. These channels differ from normal Chan
s in
that they are guaranteed to contain no more than a certain number of
elements. This is ideal when you may be writing to a channel faster than
you are able to read from it.
This module supports all the functions of Control.Concurrent.Chan except
unGetChan
and dupChan
, which are not supported for bounded channels.
Extra consistency: This version enforces that if thread Alice writes e1 followed by e2 then e1 will be returned by readBoundedChan before e2. Conversely, if thead Bob reads e1 followed by e2 then it was true that writeBoundedChan e1 preceded writeBoundedChan e2.
Previous versions did not enforce this consistency: if writeBoundedChan were preempted between putMVars or killThread arrived between putMVars then it can fail. Similarly it might fail if readBoundedChan were stopped after putMVar and before the second takeMVar. An unlucky pattern of several such deaths might actually break the invariants of the array in an unrecoverable way causing all future reads and writes to block.
Synopsis
- data BoundedChan m a
- newBoundedChan :: MonadConc m => Int -> m (BoundedChan m a)
- writeBoundedChan :: MonadConc m => BoundedChan m a -> a -> m ()
- trywriteBoundedChan :: MonadConc m => BoundedChan m a -> a -> m Bool
- readBoundedChan :: MonadConc m => BoundedChan m a -> m a
- tryreadBoundedChan :: MonadConc m => BoundedChan m a -> m (Maybe a)
- isEmptyBoundedChan :: MonadConc m => BoundedChan m a -> m Bool
- writeList2BoundedChan :: MonadConc m => BoundedChan m a -> [a] -> m ()
Documentation
data BoundedChan m a Source #
A BoundedChan
is an abstract data type representing a bounded channel.
Since: 1.6.2.0
newBoundedChan :: MonadConc m => Int -> m (BoundedChan m a) Source #
newBoundedChan n
returns a channel than can contain no more than n
elements.
Since: 1.6.2.0
writeBoundedChan :: MonadConc m => BoundedChan m a -> a -> m () Source #
Write an element to the channel. If the channel is full, this routine will block until it is able to write. Blockers wait in a fair FIFO queue.
Since: 1.6.2.0
trywriteBoundedChan :: MonadConc m => BoundedChan m a -> a -> m Bool Source #
A variant of writeBoundedChan
which, instead of blocking when the channel is
full, simply aborts and does not write the element. Note that this routine
can still block while waiting for write access to the channel.
Since: 1.6.2.0
readBoundedChan :: MonadConc m => BoundedChan m a -> m a Source #
Read an element from the channel. If the channel is empty, this routine will block until it is able to read. Blockers wait in a fair FIFO queue.
Since: 1.6.2.0
tryreadBoundedChan :: MonadConc m => BoundedChan m a -> m (Maybe a) Source #
A variant of readBoundedChan
which, instead of blocking when the channel is
empty, immediately returns Nothing
. Otherwise, tryreadBoundedChan
returns
where Just
aa
is the element read from the channel. Note that this
routine can still block while waiting for read access to the channel.
Since: 1.6.2.0
isEmptyBoundedChan :: MonadConc m => BoundedChan m a -> m Bool Source #
Deprecated: This isEmptyBoundedChan can block, no non-blocking substitute yet
Returns True
if the supplied channel is empty.
NOTE: This may block on an empty channel if there is a blocked reader. NOTE: This function is deprecated.
Since: 1.6.2.0
writeList2BoundedChan :: MonadConc m => BoundedChan m a -> [a] -> m () Source #
Write a list of elements to the channel. If the channel becomes full, this routine will block until it can write. Competing writers may interleave with this one.
Since: 1.6.2.0