diff options
Diffstat (limited to 'tests')
-rw-r--r-- | tests/all.T | 2 | ||||
-rw-r--r-- | tests/signals004.hs | 24 |
2 files changed, 26 insertions, 0 deletions
diff --git a/tests/all.T b/tests/all.T index 8647812..6746643 100644 --- a/tests/all.T +++ b/tests/all.T @@ -24,3 +24,5 @@ test('getGroupEntryForName', compose(conf, expect_fail), compile_and_run, test('getUserEntryForName', compose(conf, expect_fail), compile_and_run, ['-package unix']) + +test('signals004', normal, compile_and_run, ['-package unix']) diff --git a/tests/signals004.hs b/tests/signals004.hs new file mode 100644 index 0000000..711a6eb --- /dev/null +++ b/tests/signals004.hs @@ -0,0 +1,24 @@ +import Control.Concurrent +import System.Posix +import Control.Monad + +-- signal stress test: threads installing signal handlers while +-- signals are being constantly thrown and caught. + +installers = 50 +sigs = 10000 + +main = do + c <- newChan + m <- newEmptyMVar + installHandler sigUSR1 (handler c) Nothing + replicateM_ installers (forkIO $ do replicateM_ 1000 (install c); putMVar m ()) + replicateM_ sigs (forkIO $ raiseSignal sigUSR1) + replicateM_ installers (takeMVar m) + replicateM_ sigs (readChan c) + +handler c = Catch (writeChan c ()) + +install c = do + old <- installHandler sigUSR1 (handler c) Nothing + installHandler sigUSR1 old Nothing |