[project @ 1999-11-26 16:26:32 by simonmar]
[ghc-hetmet.git] / ghc / lib / concurrent / ChannelVar.lhs
1 %
2 % (c) The GRASP/AQUA Project, Glasgow University, 1995
3 %
4 \section[ChannelVar]{Channel variables}
5
6 Channel variables, are one-element channels described in the Concurrent
7 Haskell paper (available from @ftp://ftp.dcs.gla.ac.uk/pub/glasgow-fp/drafts@)
8
9 \begin{code}
10 module ChannelVar
11        (
12          {- abstract -}
13          CVar,
14          newCVar,       -- :: IO (CVar a)
15          writeCVar,     -- :: CVar a -> a -> IO ()
16          readCVar,      -- :: CVar a -> IO a
17          MVar
18
19        ) where
20
21 import Prelude
22 import PrelConc
23 \end{code}
24
25 @MVars@ provide the basic mechanisms for synchronising access to a shared
26 resource. @CVars@, or channel variables, provide an abstraction that guarantee
27 that the producer is not allowed to run riot, but enforces the interleaved
28 access to the channel variable,i.e., a producer is forced to wait up for
29 a consumer to remove the previous value before it can deposit a new one in the @CVar@.
30
31 \begin{code}
32
33 data CVar a
34  = CVar (MVar a)     -- prod -> cons
35         (MVar ())    -- cons -> prod
36
37 newCVar :: IO (CVar a)
38 writeCVar :: CVar a -> a -> IO ()
39 readCVar :: CVar a -> IO a
40
41 newCVar 
42  = newEmptyMVar >>= \ datum ->
43    newMVar ()   >>= \ ack ->
44    return (CVar datum ack)
45
46 writeCVar (CVar datum ack) val
47  = takeMVar ack      >> 
48    putMVar datum val >>
49    return ()
50
51 readCVar (CVar datum ack)
52  = takeMVar datum >>= \ val ->
53    putMVar ack () >> 
54    return val
55 \end{code}