1 -----------------------------------------------------------------------------
3 -- Module : Control.Concurrent.MVar
4 -- Copyright : (c) The University of Glasgow 2001
5 -- License : BSD-style (see the file libraries/base/LICENSE)
7 -- Maintainer : libraries@haskell.org
8 -- Stability : experimental
9 -- Portability : non-portable (concurrency)
11 -- Synchronising variables
13 -----------------------------------------------------------------------------
15 module Control.Concurrent.MVar
19 , newEmptyMVar -- :: IO (MVar a)
20 , newMVar -- :: a -> IO (MVar a)
21 , takeMVar -- :: MVar a -> IO a
22 , putMVar -- :: MVar a -> a -> IO ()
23 , readMVar -- :: MVar a -> IO a
24 , swapMVar -- :: MVar a -> a -> IO a
25 , tryTakeMVar -- :: MVar a -> IO (Maybe a)
26 , tryPutMVar -- :: MVar a -> a -> IO Bool
27 , isEmptyMVar -- :: MVar a -> IO Bool
28 , withMVar -- :: MVar a -> (a -> IO b) -> IO b
29 , modifyMVar_ -- :: MVar a -> (a -> IO a) -> IO ()
30 , modifyMVar -- :: MVar a -> (a -> IO (a,b)) -> IO b
32 , addMVarFinalizer -- :: MVar a -> IO () -> IO ()
37 import Hugs.ConcBase ( MVar, newEmptyMVar, newMVar, takeMVar, putMVar,
38 tryTakeMVar, tryPutMVar, isEmptyMVar,
41 import Hugs.Exception ( throwIO )
44 #ifdef __GLASGOW_HASKELL__
45 import GHC.Conc ( MVar, newEmptyMVar, newMVar, takeMVar, putMVar,
46 tryTakeMVar, tryPutMVar, isEmptyMVar, addMVarFinalizer
51 import Control.Exception as Exception
54 -- This is as close as Hugs gets to providing throw
55 throw :: Exception -> IO a
59 #ifdef __GLASGOW_HASKELL__
61 This is a combination of 'takeMVar' and 'putMVar'; ie. it takes the value
62 from the 'MVar', puts it back, and also returns it.
64 readMVar :: MVar a -> IO a
71 -- |Swap the contents of an 'MVar' for a new value.
72 swapMVar :: MVar a -> a -> IO a
73 swapMVar mvar new = modifyMVar mvar (\old -> return (new,old))
77 'withMVar' is a safe wrapper for operating on the contents of an
78 'MVar'. This operation is exception-safe: it will replace the
79 original contents of the 'MVar' if an exception is raised (see
82 withMVar :: MVar a -> (a -> IO b) -> IO b
86 b <- Exception.catch (unblock (io a))
87 (\e -> do putMVar m a; throw e)
92 A safe wrapper for modifying the contents of an 'MVar'. Like 'withMVar',
93 'modifyMVar' will replace the original contents of the 'MVar' if an
94 exception is raised during the operation.
96 modifyMVar_ :: MVar a -> (a -> IO a) -> IO ()
100 a' <- Exception.catch (unblock (io a))
101 (\e -> do putMVar m a; throw e)
105 A slight variation on 'modifyMVar_' that allows a value to be
106 returned (@b@) in addition to the modified value of the 'MVar'.
108 modifyMVar :: MVar a -> (a -> IO (a,b)) -> IO b
112 (a',b) <- Exception.catch (unblock (io a))
113 (\e -> do putMVar m a; throw e)