modify to use TVar instead of QSemN (which has gone)
authorSimon Marlow <marlowsd@gmail.com>
Thu, 23 Aug 2012 08:46:31 +0000 (09:46 +0100)
committerSimon Marlow <marlowsd@gmail.com>
Thu, 23 Aug 2012 08:46:31 +0000 (09:46 +0100)
tests/stm053.hs

index 12bcc24..b6af5db 100644 (file)
@@ -1,4 +1,3 @@
-{-# OPTIONS_GHC -fglasgow-exts #-}
 -- !!! test threadDelay, Random, and QSemN.
 
 -- Variation of conc023, testing STM timeouts instead of IO
@@ -7,18 +6,18 @@ import System.Random
 import Control.Concurrent
 import Control.Exception
 import Control.Concurrent.STM
+import Control.Monad
 
 n = 5000  -- no. of threads
 m = 3000  -- maximum delay
 
 main = do
-   s <- newQSemN n
-   is <- sequence (take n (repeat (getStdRandom (randomR (1,m)))))
+   s <- newTVarIO 0
+   is <- replicateM n (getStdRandom (randomR (1,m)))
    mapM (fork_sleep s) is
-   waitQSemN s n
+   atomically $ do i <- readTVar s; check (i == n)
    where
-       fork_sleep :: QSemN -> Int -> IO ThreadId
-       fork_sleep s i = forkIO (do waitQSemN s 1
-                                   t <- registerDelay (i*1000)
-                                   atomically $ (readTVar t >>= check)
-                                   signalQSemN s 1)
+        fork_sleep :: TVar Int -> Int -> IO ThreadId
+        fork_sleep s i = forkIO $ do
+             t <- registerDelay (i*1000)
+             atomically $ do readTVar t >>= check; modifyTVar s (+1)