-- This test program triggers different thread stop encodings in -- eventlogs, depending on GHC version (black hole, mvar read, mvar) module Main where import Control.Concurrent import Debug.Trace import GHC.Conc main = do putStrLn "suggest to run with +RTS -lsu-g-p -K80m -k10m -H200m -C1s" -- define some time-consuming computation let stuff = ack 3 10 -- create MVars to block on v1 <- newMVar "full" v2 <- newEmptyMVar -- create a thread which blackholes something, and re-fills the MVar traceEventIO "forking child thread" forkIO (do traceEventIO "child" putStrLn ("child thread sez " ++ show stuff) traceEventIO "filling full MVar" putMVar v1 "filled full var" yield traceEventIO "filling empty MVar" putMVar v2 "filled empty var" yield traceEventIO "child finished" ) yield putStrLn ("and the main thread sez " ++ show stuff) traceEventIO "emptying full MVar" s1 <- takeMVar v1 putStrLn ("from MVar: " ++ s1) traceEventIO "reading empty MVar" s2 <- readMVar v2 putStrLn ("from MVar: " ++ s2) ack :: Integer -> Integer -> Integer ack 0 m = m+1 ack n 0 = ack (n-1) 1 ack n m = ack (n-1) (ack n (m-1))