File: stop.hs

package info (click to toggle)
haskell-ghc-events 0.19.0.1-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 9,396 kB
  • sloc: haskell: 3,552; ansic: 146; makefile: 6
file content (42 lines) | stat: -rw-r--r-- 1,259 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
-- 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))