X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=Control%2FConcurrent%2FQSem.hs;h=5a512d83c3fd33c6f05b843908e33c654f6fed56;hb=202065fe56bd604d26d1924cbc9c0959266ca7ea;hp=88a44627048dce398b4959a015d4e07d340c62b3;hpb=9fa9bc17072a58c0bae2cce4764d38677e96ac29;p=ghc-base.git diff --git a/Control/Concurrent/QSem.hs b/Control/Concurrent/QSem.hs index 88a4462..5a512d8 100644 --- a/Control/Concurrent/QSem.hs +++ b/Control/Concurrent/QSem.hs @@ -2,20 +2,19 @@ -- | -- 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 +-- Portability : non-portable (concurrency) -- --- $Id: QSem.hs,v 1.3 2002/04/24 16:31:37 simonmar Exp $ --- --- 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