add install-includes: field
[packages/pretty.git] / Control / Concurrent / QSem.hs
index 88a4462..5a512d8 100644 (file)
@@ -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