content: -- 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))
  