summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsimonmar <unknown>2000-04-12 17:08:15 +0000
committersimonmar <unknown>2000-04-12 17:08:15 +0000
commit3e567b6507f58971899bc0a7fa6640cd033b95e1 (patch)
tree73ec22885b81feddd98de742fbaec73a7ddc7082
parent7e150969472ef9a48af9a7a2cc23a84952e90078 (diff)
downloadhaskell-3e567b6507f58971899bc0a7fa6640cd033b95e1.tar.gz
[project @ 2000-04-12 17:08:15 by simonmar]
add takeMaybeMVar
-rw-r--r--ghc/lib/std/PrelConc.lhs19
1 files changed, 12 insertions, 7 deletions
diff --git a/ghc/lib/std/PrelConc.lhs b/ghc/lib/std/PrelConc.lhs
index f096db1fd2..d75bbca426 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,