unagi-chan-0.1.0.2: tests/Chan003.hs
module Chan003 (checkDeadlocksWriter) where
import Control.Concurrent
import qualified Control.Concurrent.Chan.Unagi as U
import Control.Exception
import Control.Monad
-- OBSOLETE FOR NOW; we have more clever and careful deadlock tests in
-- Deadlocks
-- test for deadlocks from async exceptions raised in writer
checkDeadlocksWriter :: Int -> IO ()
checkDeadlocksWriter n = void $
replicateM_ n $ do
(i,o) <- U.newChan
wStart <- newEmptyMVar
wid <- forkIO (putMVar wStart () >> ( forever $ U.writeChan i (0::Int)) )
-- wait for writer to start
takeMVar wStart >> threadDelay 1
throwTo wid ThreadKilled
-- did killing the writer damage queue for writes or reads?
U.writeChan i (1::Int)
z <- U.readChan o
unless (z == 0) $
error "Writer never got a chance to write!"