X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=Control%2FConcurrent%2FQSem.hs;h=5a512d83c3fd33c6f05b843908e33c654f6fed56;hb=dae853e21f2a1ac47cee4b63b6cc305129320edb;hp=2cc9f552bdccec8ce747e102f36bd7d135dde8ba;hpb=c8ec30e25e79091d115f105c610038f18b041055;p=ghc-base.git diff --git a/Control/Concurrent/QSem.hs b/Control/Concurrent/QSem.hs index 2cc9f55..5a512d8 100644 --- a/Control/Concurrent/QSem.hs +++ b/Control/Concurrent/QSem.hs @@ -1,21 +1,20 @@ ----------------------------------------------------------------------------- --- +-- | -- Module : Control.Concurrent.QSem -- Copyright : (c) The University of Glasgow 2001 --- License : BSD-style (see the file libraries/core/LICENSE) +-- License : BSD-style (see the file libraries/base/LICENSE) -- -- Maintainer : libraries@haskell.org -- Stability : experimental --- Portability : non-portable --- --- $Id: QSem.hs,v 1.2 2001/07/04 11:30:52 simonmar Exp $ +-- Portability : non-portable (concurrency) -- --- General semaphores +-- Simple quantity semaphores. -- ----------------------------------------------------------------------------- module Control.Concurrent.QSem - ( QSem, -- abstract + ( -- * Simple Quantity Semaphores + QSem, -- abstract newQSem, -- :: Int -> IO QSem waitQSem, -- :: QSem -> IO () signalQSem -- :: QSem -> IO () @@ -23,6 +22,9 @@ module Control.Concurrent.QSem import Prelude import Control.Concurrent.MVar +import Data.Typeable + +#include "Typeable.h" -- General semaphores are also implemented readily in terms of shared -- @MVar@s, only have to catch the case when the semaphore is tried @@ -31,13 +33,19 @@ import Control.Concurrent.MVar -- representing threads currently waiting. The counter is a shared -- variable, ensuring the mutual exclusion on its access. +-- |A 'QSem' is a simple quantity semaphore, in which the available +-- \"quantity\" is always dealt with in units of one. newtype QSem = QSem (MVar (Int, [MVar ()])) +INSTANCE_TYPEABLE0(QSem,qSemTc,"QSem") + +-- |Build a new 'QSem' newQSem :: Int -> IO QSem newQSem init = do sem <- newMVar (init,[]) return (QSem sem) +-- |Wait for a unit to become available waitQSem :: QSem -> IO () waitQSem (QSem sem) = do (avail,blocked) <- takeMVar sem -- gain ex. access @@ -57,6 +65,7 @@ waitQSem (QSem sem) = do putMVar sem (0, blocked++[block]) takeMVar block +-- |Signal that a unit of the 'QSem' is available signalQSem :: QSem -> IO () signalQSem (QSem sem) = do (avail,blocked) <- takeMVar sem