@@ -10,6 +10,7 @@ module Control.Distributed.Process.Internal.StrictMVar
10 , withMVar
10 , withMVar
11 , modifyMVar_
11 , modifyMVar_
12 , modifyMVar
12 , modifyMVar
13 , mkWeakMVar
14 , mkWeakMVar
@@ -26,6 +27,7 @@ import qualified Control.Concurrent.MVar as MVar
26 , withMVar
27 , withMVar
27 , modifyMVar_
28 , modifyMVar_
28 , modifyMVar
29 , modifyMVar
30import GHC.MVar (MVar(MVar))
32import GHC.MVar (MVar(MVar))
31import GHC.IO (IO(IO))
33import GHC.IO (IO(IO))
@@ -61,6 +63,12 @@ modifyMVar (StrictMVar v) f = MVar.modifyMVar v (f >=> evaluateFst)
61 evaluateFst :: (a, b) -> IO (a, b)
63 evaluateFst :: (a, b) -> IO (a, b)
62 evaluateFst (x, y) = evaluate x >> return (x, y)
64 evaluateFst (x, y) = evaluate x >> return (x, y)
66+modifyMVarMasked :: StrictMVar a -> (a -> IO (a, b)) -> IO b
67+modifyMVarMasked (StrictMVar v) f = MVar.modifyMVarMasked v (f >=> evaluateFst)
69+ evaluateFst :: (a, b) -> IO (a, b)
70+ evaluateFst (x, y) = evaluate x >> return (x, y)
64mkWeakMVar :: StrictMVar a -> IO () -> IO (Weak (StrictMVar a))
72mkWeakMVar :: StrictMVar a -> IO () -> IO (Weak (StrictMVar a))
65mkWeakMVar m@(StrictMVar (MVar m#)) f = IO $ \s ->
73mkWeakMVar m@(StrictMVar (MVar m#)) f = IO $ \s ->
66 case mkWeak# m# m f s of (# s1, w #) -> (# s1, Weak w #)
74 case mkWeak# m# m f s of (# s1, w #) -> (# s1, Weak w #)