projects
/
ghc-base.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Use explicit language extensions & remove extension fields from base.cabal
[ghc-base.git]
/
Control
/
Concurrent
/
QSem.hs
diff --git
a/Control/Concurrent/QSem.hs
b/Control/Concurrent/QSem.hs
index
c009aaf
..
22f6c0c
100644
(file)
--- a/
Control/Concurrent/QSem.hs
+++ b/
Control/Concurrent/QSem.hs
@@
-1,3
+1,5
@@
+{-# LANGUAGE CPP #-}
+
-----------------------------------------------------------------------------
-- |
-- Module : Control.Concurrent.QSem
-----------------------------------------------------------------------------
-- |
-- Module : Control.Concurrent.QSem
@@
-22,7
+24,7
@@
module Control.Concurrent.QSem
import Prelude
import Control.Concurrent.MVar
import Prelude
import Control.Concurrent.MVar
-import Control.Exception ( block )
+import Control.Exception ( mask_ )
import Data.Typeable
#include "Typeable.h"
import Data.Typeable
#include "Typeable.h"
@@
-36,7
+38,7
@@
import Data.Typeable
-- |A 'QSem' is a simple quantity semaphore, in which the available
-- \"quantity\" is always dealt with in units of one.
-- |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 ()]))
+newtype QSem = QSem (MVar (Int, [MVar ()])) deriving Eq
INSTANCE_TYPEABLE0(QSem,qSemTc,"QSem")
INSTANCE_TYPEABLE0(QSem,qSemTc,"QSem")
@@
-51,7
+53,7
@@
newQSem initial =
-- |Wait for a unit to become available
waitQSem :: QSem -> IO ()
-- |Wait for a unit to become available
waitQSem :: QSem -> IO ()
-waitQSem (QSem sem) = block $ do
+waitQSem (QSem sem) = mask_ $ do
(avail,blocked) <- takeMVar sem -- gain ex. access
if avail > 0 then
let avail' = avail-1
(avail,blocked) <- takeMVar sem -- gain ex. access
if avail > 0 then
let avail' = avail-1
@@
-72,7
+74,7
@@
waitQSem (QSem sem) = block $ do
-- |Signal that a unit of the 'QSem' is available
signalQSem :: QSem -> IO ()
-- |Signal that a unit of the 'QSem' is available
signalQSem :: QSem -> IO ()
-signalQSem (QSem sem) = block $ do
+signalQSem (QSem sem) = mask_ $ do
(avail,blocked) <- takeMVar sem
case blocked of
[] -> let avail' = avail+1
(avail,blocked) <- takeMVar sem
case blocked of
[] -> let avail' = avail+1