+{-# OPTIONS_GHC -XNoImplicitPrelude #-}
-----------------------------------------------------------------------------
-- |
-- Module : Control.Concurrent.MVar
#endif
#ifdef __GLASGOW_HASKELL__
-import GHC.Conc ( MVar, newEmptyMVar, newMVar, takeMVar, putMVar,
+import GHC.MVar ( MVar, newEmptyMVar, newMVar, takeMVar, putMVar,
tryTakeMVar, tryPutMVar, isEmptyMVar, addMVarFinalizer
)
#endif
+#ifdef __GLASGOW_HASKELL__
+import GHC.Base
+#else
import Prelude
-import Control.Exception as Exception
+#endif
+
+import Control.Exception.Base
{-|
This is a combination of 'takeMVar' and 'putMVar'; ie. it takes the value
withMVar m io =
block $ do
a <- takeMVar m
- b <- Exception.catch (unblock (io a))
- (\e -> do putMVar m a; throw e)
+ b <- unblock (io a) `onException` putMVar m a
putMVar m a
return b
modifyMVar_ m io =
block $ do
a <- takeMVar m
- a' <- Exception.catch (unblock (io a))
- (\e -> do putMVar m a; throw e)
+ a' <- unblock (io a) `onException` putMVar m a
putMVar m a'
{-|
modifyMVar m io =
block $ do
a <- takeMVar m
- (a',b) <- Exception.catch (unblock (io a))
- (\e -> do putMVar m a; throw e)
+ (a',b) <- unblock (io a) `onException` putMVar m a
putMVar m a'
return b