Add `withMVarMasked` (re #8818)
authorHerbert Valerio Riedel <hvr@gnu.org>
Tue, 25 Feb 2014 10:04:46 +0000 (11:04 +0100)
committerHerbert Valerio Riedel <hvr@gnu.org>
Tue, 25 Feb 2014 10:04:46 +0000 (11:04 +0100)
Like `withMVar`, but the @IO@ action in the second argument is executed
with asynchronous exceptions masked. This completes the `MVar` API,
which already contained `modifyMVarMasked` and `modifyMVarMasked_`.

Signed-off-by: Herbert Valerio Riedel <hvr@gnu.org>
libraries/base/Control/Concurrent/MVar.hs
libraries/base/changelog.md

index aaf1939..72a44d3 100644 (file)
@@ -139,6 +139,7 @@ module Control.Concurrent.MVar
         , tryPutMVar
         , isEmptyMVar
         , withMVar
+        , withMVarMasked
         , modifyMVar_
         , modifyMVar
         , modifyMVarMasked_
@@ -189,6 +190,21 @@ withMVar m io =
     return b
 
 {-|
+  Like 'withMVar', but the @IO@ action in the second argument is executed
+  with asynchronous exceptions masked.
+
+  /Since: 4.7.0.0/
+-}
+{-# INLINE withMVarMasked #-}
+withMVarMasked :: MVar a -> (a -> IO b) -> IO b
+withMVarMasked m io =
+  mask_ $ do
+    a <- takeMVar m
+    b <- io a `onException` putMVar m a
+    putMVar m a
+    return b
+
+{-|
   An exception-safe wrapper for modifying the contents of an 'MVar'.
   Like 'withMVar', 'modifyMVar' will replace the original contents of
   the 'MVar' if an exception is raised during the operation.  This
index ef9fa08..88ceec5 100644 (file)
     `putMVar`.  There is also a new `tryReadMVar` which is a
     non-blocking version.
 
+  * New `Control.Concurrent.MVar.withMVarMasked` which executes
+    `IO` action with asynchronous exceptions masked in the same style
+    as the existing `modifyMVarMasked` and `modifyMVarMasked_`.
+
   * New `threadWait{Read,Write}STM :: Fd -> IO (STM (), IO ())`
     functions added to `Control.Concurrent` for waiting on FD
     readiness with STM actions.