{-# LANGUAGE ScopedTypeVariables, DeriveDataTypeable #-}
module Control.CUtils.Semaphore (Sem, newSem, putSem, takeSem) where
import Data.Data
import Data.IORef
import Foreign.Storable
import Control.Concurrent.MVar
import Control.Concurrent
import Control.Monad.ST
import Control.Monad
import Control.Monad.Loops
import Control.Exception
import Control.Exception.Assert
import Control.Concurrent.QSemN
newtype Sem = Sem { unSem :: QSemN }
deriving Typeable
instance Data Sem
newSem :: IO Sem
newSem = liftM Sem(newQSemN 0)
putSem :: Sem -> Int -> IO()
{-# INLINE putSem #-}
putSem = signalQSemN. unSem
takeSem :: Sem -> Int -> IO()
{-# INLINE takeSem #-}
takeSem = waitQSemN. unSem