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