module Data.Mutex where
import Prelude
import Data.Var
data Mutex = Mutex (Var Bool)
newMutex :: Fay Mutex
newMutex = do v <- newVar False
return (Mutex v)
ifMutexFree :: Mutex -> Fay () -> Fay ()
ifMutexFree (Mutex var) action = do
locked <- get var
if locked then return () else action
whenMutexFree :: Mutex -> Fay () -> Fay ()
whenMutexFree (Mutex var) cont = do
locked <- get var
if locked
then do _ <- withUnsubscriber
(subscribe var)
(\unsubscribe lockedNow ->
if lockedNow
then return ()
else do unsubscribe ()
cont)
return ()
else cont
lockMutex :: Mutex -> (Fay () -> Fay a) -> Fay a
lockMutex (Mutex var) cont = do
locked <- get var
if locked
then error "mutex is already locked"
else do set var True
cont (set var False)