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