Implement tryAtomicReadMVar.
authorEdward Z. Yang <ezyang@mit.edu>
Wed, 10 Jul 2013 20:34:09 +0000 (13:34 -0700)
committerEdward Z. Yang <ezyang@mit.edu>
Wed, 10 Jul 2013 20:34:09 +0000 (13:34 -0700)
Signed-off-by: Edward Z. Yang <ezyang@mit.edu>
Control/Concurrent/MVar.hs
GHC/MVar.hs

index 1bccc1e..62a9161 100644 (file)
@@ -143,6 +143,7 @@ module Control.Concurrent.MVar
         , modifyMVarMasked
 #ifndef __HUGS__
         , atomicReadMVar
+        , tryAtomicReadMVar
         , mkWeakMVar
         , addMVarFinalizer
 #endif
index 6a892db..5e819a2 100644 (file)
@@ -27,6 +27,7 @@ module GHC.MVar (
         , putMVar
         , tryTakeMVar
         , tryPutMVar
+        , tryAtomicReadMVar
         , isEmptyMVar
         , addMVarFinalizer
     ) where
@@ -136,6 +137,15 @@ tryPutMVar (MVar mvar#) x = IO $ \ s# ->
         (# s, 0# #) -> (# s, False #)
         (# s, _  #) -> (# s, True #)
 
+-- |A non-blocking version of 'atomicReadMVar'.  The 'tryAtomicReadMVar' function
+-- returns immediately, with 'Nothing' if the 'MVar' was empty, or
+-- @'Just' a@ if the 'MVar' was full with contents @a@.
+tryAtomicReadMVar :: MVar a -> IO (Maybe a)
+tryAtomicReadMVar (MVar m) = IO $ \ s ->
+    case tryAtomicReadMVar# m s of
+        (# s', 0#, _ #) -> (# s', Nothing #)      -- MVar is empty
+        (# s', _,  a #) -> (# s', Just a  #)      -- MVar is full
+
 -- |Check whether a given 'MVar' is empty.
 --
 -- Notice that the boolean value returned  is just a snapshot of