module LIO.Concurrent.LMVar.TCB (
LMVar(..)
, newEmptyLMVarTCB, newLMVarTCB
, takeLMVarTCB, tryTakeLMVarTCB
, putLMVarTCB, tryPutLMVarTCB
, readLMVarTCB
, swapLMVarTCB
, isEmptyLMVarTCB
) where
import Control.Concurrent.MVar
import LIO.Label
import LIO.Core
import LIO.TCB
data LMVar l a = LMVarTCB { labelOfLMVar :: !l
, unlabelLMVarTCB :: MVar a
}
instance LabelOf LMVar where
labelOf = labelOfLMVar
newEmptyLMVarTCB :: MonadLIO l m => l -> m (LMVar l a)
newEmptyLMVarTCB l = do
m <- liftLIO . ioTCB $ newEmptyMVar
return $ LMVarTCB l m
newLMVarTCB :: MonadLIO l m => l -> a -> m (LMVar l a)
newLMVarTCB l a = do
m <- liftLIO . ioTCB $ newMVar a
return $ LMVarTCB l m
takeLMVarTCB :: MonadLIO l m => LMVar l a -> m a
takeLMVarTCB (LMVarTCB _ m) = liftLIO . ioTCB $ takeMVar m
tryTakeLMVarTCB :: MonadLIO l m => LMVar l a -> m (Maybe a)
tryTakeLMVarTCB (LMVarTCB _ m) = liftLIO . ioTCB $ tryTakeMVar m
putLMVarTCB :: MonadLIO l m => LMVar l a -> a -> m ()
putLMVarTCB (LMVarTCB _ m) a = liftLIO . ioTCB $ putMVar m a
tryPutLMVarTCB :: MonadLIO l m => LMVar l a -> a -> m Bool
tryPutLMVarTCB (LMVarTCB _ m) x = liftLIO . ioTCB $ tryPutMVar m x
readLMVarTCB :: MonadLIO l m => LMVar l a -> m a
readLMVarTCB (LMVarTCB _ m) = liftLIO . ioTCB $ readMVar m
swapLMVarTCB :: MonadLIO l m => LMVar l a -> a -> m a
swapLMVarTCB (LMVarTCB _ m) x = liftLIO . ioTCB $ swapMVar m x
isEmptyLMVarTCB :: MonadLIO l m => LMVar l a -> m Bool
isEmptyLMVarTCB (LMVarTCB _ m) = liftLIO . ioTCB $ isEmptyMVar m