From 3e567b6507f58971899bc0a7fa6640cd033b95e1 Mon Sep 17 00:00:00 2001 From: simonmar Date: Wed, 12 Apr 2000 17:08:15 +0000 Subject: [PATCH] [project @ 2000-04-12 17:08:15 by simonmar] add takeMaybeMVar --- ghc/lib/std/PrelConc.lhs | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/ghc/lib/std/PrelConc.lhs b/ghc/lib/std/PrelConc.lhs index f096db1..d75bbca 100644 --- a/ghc/lib/std/PrelConc.lhs +++ b/ghc/lib/std/PrelConc.lhs @@ -33,11 +33,13 @@ module PrelConc , putMVar -- :: MVar a -> a -> IO () , readMVar -- :: MVar a -> IO a , swapMVar -- :: MVar a -> a -> IO a + , takeMaybeMVar -- :: MVar a -> IO (Maybe a) , isEmptyMVar -- :: MVar a -> IO Bool ) where import PrelBase +import PrelMaybe import PrelErr ( parError, seqError ) import PrelST ( liftST ) import PrelIOBase ( IO(..), MVar(..), unsafePerformIO ) @@ -115,48 +117,51 @@ writes. --Defined in IOBase to avoid cycle: data MVar a = MVar (SynchVar# RealWorld a) newEmptyMVar :: IO (MVar a) - newEmptyMVar = IO $ \ s# -> case newMVar# s# of (# s2#, svar# #) -> (# s2#, MVar svar# #) takeMVar :: MVar a -> IO a - takeMVar (MVar mvar#) = IO $ \ s# -> takeMVar# mvar# s# putMVar :: MVar a -> a -> IO () - putMVar (MVar mvar#) x = IO $ \ s# -> case putMVar# mvar# x s# of s2# -> (# s2#, () #) newMVar :: a -> IO (MVar a) - newMVar value = newEmptyMVar >>= \ mvar -> putMVar mvar value >> return mvar readMVar :: MVar a -> IO a - readMVar mvar = takeMVar mvar >>= \ value -> putMVar mvar value >> return value swapMVar :: MVar a -> a -> IO a - swapMVar mvar new = takeMVar mvar >>= \ old -> putMVar mvar new >> return old +-- takeMaybeMVar is a non-blocking takeMVar +takeMaybeMVar :: MVar a -> IO (Maybe a) +takeMaybeMVar (MVar m) = IO $ \ s -> + case takeMaybeMVar# m s of + (# s, 0#, _ #) -> (# s, Nothing #) -- MVar is empty + (# s, _, a #) -> (# s, Just a #) -- MVar is full + {- Low-level op. for checking whether an MVar is filled-in or not. Notice that the boolean value returned is just a snapshot of the state of the MVar. By the time you get to react on its result, the MVar may have been filled (or emptied) - so be extremely - careful when using this operation. + careful when using this operation. + + Use takeMaybeMVar instead if possible. If you can re-work your abstractions to avoid having to depend on isEmptyMVar, then you're encouraged to do so, -- 1.7.10.4