@@ -10,6 +10,7 @@ module Control.Distributed.Process.Internal.StrictMVar
1010 , withMVar
1111 , modifyMVar_
1212 , modifyMVar
13+ , modifyMVarMasked
1314 , mkWeakMVar
1415 ) where
1516
@@ -26,6 +27,7 @@ import qualified Control.Concurrent.MVar as MVar
2627 , withMVar
2728 , modifyMVar_
2829 , modifyMVar
30+ , modifyMVarMasked
2931 )
3032import GHC.MVar (MVar(MVar))
3133import GHC.IO (IO(IO))
@@ -61,6 +63,12 @@ modifyMVar (StrictMVar v) f = MVar.modifyMVar v (f >=> evaluateFst)
6163 evaluateFst :: (a, b) -> IO (a, b)
6264 evaluateFst (x, y) = evaluate x >> return (x, y)
6365
66+modifyMVarMasked :: StrictMVar a -> (a -> IO (a, b)) -> IO b
67+modifyMVarMasked (StrictMVar v) f = MVar.modifyMVarMasked v (f >=> evaluateFst)
68+ where
69+ evaluateFst :: (a, b) -> IO (a, b)
70+ evaluateFst (x, y) = evaluate x >> return (x, y)
71+
6472mkWeakMVar :: StrictMVar a -> IO () -> IO (Weak (StrictMVar a))
6573mkWeakMVar m@(StrictMVar (MVar m#)) f = IO $ \s ->
6674 case mkWeak# m# m f s of (# s1, w #) -> (# s1, Weak w #)