No subject
Thu Feb 24 17:58:36 CET 2011
---
tests/ghc-regress/lib/Concurrent/QSemN002.hs | 63
++++++++++++++++++++
tests/ghc-regress/lib/Concurrent/QSemN002.stdout | 13 ++++
tests/ghc-regress/lib/Concurrent/SampleVar002.hs | 47 +++++++++++++++
.../ghc-regress/lib/Concurrent/SampleVar002.stdout | 8 +++
tests/ghc-regress/lib/Concurrent/all.T | 4 +-
5 files changed, 134 insertions(+), 1 deletions(-)
create mode 100644 tests/ghc-regress/lib/Concurrent/QSemN002.hs
create mode 100644 tests/ghc-regress/lib/Concurrent/QSemN002.stdout
create mode 100644 tests/ghc-regress/lib/Concurrent/SampleVar002.hs
create mode 100644 tests/ghc-regress/lib/Concurrent/SampleVar002.stdout
diff --git a/tests/ghc-regress/lib/Concurrent/QSemN002.hs
b/tests/ghc-regress/lib/Concurrent/QSemN002.hs
new file mode 100644
index 0000000..e853be9
--- /dev/null
+++ b/tests/ghc-regress/lib/Concurrent/QSemN002.hs
@@ -0,0 +1,63 @@
+-- Check for fix for #3160, http://hackage.haskell.org/trac/ghc/ticket/3160
+module Main where
+
+import Prelude hiding (read)
+import Control.Concurrent
+import Control.Concurrent.MVar
+import Control.Concurrent.QSemN
+import Control.Exception
+import System.Exit
+
+-- delay = threadDelay (1000*100)
+delay = yield
+
+fork x = do m <- newEmptyMVar
+ t <- forkIO (finally x (putMVar m ()))
+ delay
+ return (t,m)
+
+stop (t,m) = do killThread t
+ delay
+ takeMVar m
+
+-- True if test passed, False if test failed
+testSem :: Integral n
+ => String
+ -> (n -> IO a)
+ -> (a->IO ())
+ -> (a -> IO ())
+ -> IO Bool
+testSem name new wait signal = do
+ putStrLn ("\nTest "++ name)
+ q <- new 0
+ putStrLn "0: forkIO wait thread 1"
+ (t1,m1) <- fork $ do
+ wait q `onException` (putStrLn "1: wait interrupted")
+ putStrLn "1: wait done UNEXPECTED"
+ putStrLn "0: stop thread 1"
+ stop (t1,m1)
+ putStrLn "0: signal q #1"
+ signal q
+ delay
+ putStrLn "0: forkIO wait thread 2"
+ (t2,m2) <- fork $ do
+ wait q `onException` (putStrLn "2: wait interrupted UNEXPECTED")
+ putStrLn "2: wait done"
+ putStrLn "0: forkIO wait thread 3"
+ result <- newEmptyMVar
+ (t3,m3) <- fork $ do
+ wait q `onException` (putStrLn "3: wait interrupted (QUANTITY LOST)
FAIL" >> putMVar result False)
+ putStrLn "3: wait done (QUANTITY CONSERVED) PASS"
+ putMVar result True
+ putStrLn "0: signal q #2"
+ signal q
+ delay
+ putStrLn "0: stop thread 2"
+ stop (t2,m2)
+ putStrLn "0: stop thread 3"
+ stop (t3,m3)
+ takeMVar result
+
+main = do
+ _ <- testSem "QSemN" newQSemN (flip waitQSemN 1) (flip signalQSemN 1)
+ return ()
diff --git a/tests/ghc-regress/lib/Concurrent/QSemN002.stdout
b/tests/ghc-regress/lib/Concurrent/QSemN002.stdout
new file mode 100644
index 0000000..def667d
--- /dev/null
+++ b/tests/ghc-regress/lib/Concurrent/QSemN002.stdout
@@ -0,0 +1,13 @@
+
+Test QSemN
+0: forkIO wait thread 1
+0: stop thread 1
+1: wait interrupted
+0: signal q #1
+0: forkIO wait thread 2
+2: wait done
+0: forkIO wait thread 3
+0: signal q #2
+3: wait done (QUANTITY CONSERVED) PASS
+0: stop thread 2
+0: stop thread 3
diff --git a/tests/ghc-regress/lib/Concurrent/SampleVar002.hs
b/tests/ghc-regress/lib/Concurrent/SampleVar002.hs
new file mode 100644
index 0000000..a33d182
--- /dev/null
+++ b/tests/ghc-regress/lib/Concurrent/SampleVar002.hs
@@ -0,0 +1,47 @@
+module Main where
+
+import Prelude hiding (read)
+import Control.Concurrent
+import Control.Exception
+import Control.Concurrent.MVar
+import Control.Concurrent.SampleVar
+import System.Timeout
+
+delay = yield
+
+fork x = do m <- newEmptyMVar
+ t <- forkIO (finally x (putMVar m ()))
+ delay
+ return (t,m)
+
+stop (t,m) = do killThread t
+ delay
+ takeMVar m
+
+testSV name newEmpty read write = do
+ putStrLn ("\nTest "++ name)
+ sv <- newEmpty
+ putStrLn "0: forkIO read thread 1"
+ (t1,m1) <- fork $ do
+ read sv `onException` (putStrLn "1: read interrupted")
+ putStrLn "1: read done UNEXPECTED"
+ putStrLn "0: stop thread 1"
+ stop (t1,m1)
+ putStrLn "0: write sv #1"
+ write sv 1
+ putStrLn "0: write sv #2 with timeout"
+ m <- timeout (1000*100) (write sv 2)
+ case m of
+ Nothing -> do
+ putStrLn "0: timeout triggered, write sv #2 blocked, FAIL"
+ return False
+ Just () -> do
+ putStrLn "0: write sv #2 returned, PASS"
+ return True
+
+main = do
+ _ <- testSV "SampleVar" newEmptySampleVar readSampleVar writeSampleVar
+ return ()
+
+
+
diff --git a/tests/ghc-regress/lib/Concurrent/SampleVar002.stdout
b/tests/ghc-regress/lib/Concurrent/SampleVar002.stdout
new file mode 100644
index 0000000..cd5853a
--- /dev/null
+++ b/tests/ghc-regress/lib/Concurrent/SampleVar002.stdout
@@ -0,0 +1,8 @@
+
+Test SampleVar
+0: forkIO read thread 1
+0: stop thread 1
+1: read interrupted
+0: write sv #1
+0: write sv #2 with timeout
+0: write sv #2 returned, SUCCESS
diff --git a/tests/ghc-regress/lib/Concurrent/all.T
b/tests/ghc-regress/lib/Concurrent/all.T
index 5ba43d0..a63f23c 100644
--- a/tests/ghc-regress/lib/Concurrent/all.T
+++ b/tests/ghc-regress/lib/Concurrent/all.T
@@ -7,5 +7,7 @@ test('Chan001', reqlib('QuickCheck'),
compile_and_run, ['-package QuickChec
test('MVar001', reqlib('QuickCheck'), compile_and_run, ['-package
QuickCheck'])
test('QSemN001', reqlib('QuickCheck'), compile_and_run, ['-package
QuickCheck'])
test('QSem001', reqlib('QuickCheck'), compile_and_run, ['-package
QuickCheck'])
-test('ThreadDelay001', normal, compile_and_run, [''])
test('QSem002', normal, compile_and_run, [''])
+test('QSemN002', normal, compile_and_run, [''])
+test('SampleVar002', normal, compile_and_run, [''])
+test('ThreadDelay001', normal, compile_and_run, [''])
--
1.7.2
More information about the Cvs-ghc
mailing list