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,
42 #ifdef __GLASGOW_HASKELL__
43 import GHC.Conc ( MVar, newEmptyMVar, newMVar, takeMVar, putMVar,
44 tryTakeMVar, tryPutMVar, isEmptyMVar, addMVarFinalizer
49 import Control.Exception.Base
52 This is a combination of 'takeMVar' and 'putMVar'; ie. it takes the value
53 from the 'MVar', puts it back, and also returns it.
55 readMVar :: MVar a -> IO a
63 Take a value from an 'MVar', put a new value into the 'MVar' and
64 return the value taken. Note that there is a race condition whereby
65 another process can put something in the 'MVar' after the take
66 happens but before the put does.
68 swapMVar :: MVar a -> a -> IO a
76 'withMVar' is a safe wrapper for operating on the contents of an
77 'MVar'. This operation is exception-safe: it will replace the
78 original contents of the 'MVar' if an exception is raised (see
81 {-# INLINE withMVar #-}
82 -- inlining has been reported to have dramatic effects; see
83 -- http://www.haskell.org//pipermail/haskell/2006-May/017907.html
84 withMVar :: MVar a -> (a -> IO b) -> IO b
88 b <- unblock (io a) `onException` putMVar m a
93 A safe wrapper for modifying the contents of an 'MVar'. Like 'withMVar',
94 'modifyMVar' will replace the original contents of the 'MVar' if an
95 exception is raised during the operation.
97 {-# INLINE modifyMVar_ #-}
98 modifyMVar_ :: MVar a -> (a -> IO a) -> IO ()
102 a' <- unblock (io a) `onException` putMVar m a
106 A slight variation on 'modifyMVar_' that allows a value to be
107 returned (@b@) in addition to the modified value of the 'MVar'.
109 {-# INLINE modifyMVar #-}
110 modifyMVar :: MVar a -> (a -> IO (a,b)) -> IO b
114 (a',b) <- unblock (io a) `onException` putMVar m a