2 % (c) The GRASP/AQUA Project, Glasgow University, 1995
4 \section[ChannelVar]{Channel variables}
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@)
14 newCVar, --:: IO (CVar a)
15 putCVar, --:: CVar a -> a -> IO ()
16 getCVar, --:: CVar a -> IO a
22 import PreludePrimIO ( newEmptyMVar, newMVar, putMVar,
23 readMVar, takeMVar, _MVar
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@.
36 = CVar (_MVar a) -- prod -> cons
37 (_MVar ()) -- cons -> prod
39 newCVar :: IO (CVar a)
40 putCVar :: CVar a -> a -> IO ()
41 getCVar :: CVar a -> IO a
44 = newEmptyMVar >>= \ datum ->
45 newMVar () >>= \ ack ->
46 return (CVar datum ack)
48 putCVar (CVar datum ack) val
53 getCVar (CVar datum ack)
54 = takeMVar datum >>= \ val ->