module Main where
import GHC.RTS.Events
import System.Environment
import Text.Printf
import Data.List
import Data.Function
main = do
[file] <- getArgs
fmt <- buildFormat file
printf "Event Types:\n"
case fmtHeader fmt of
Header (EventTypes ets) -> putStrLn (unlines (map ppEventType ets))
let pes = events (fmtData fmt)
sorted = sortBy (compare `on` ts) (reverse pes)
-- the events come out reversed, and we want a stable sort
printf "Events:\n"
putStrLn $ unlines $ map ppEvent $ sorted
-- putStrLn (show $ getFirstPE dat)
-- let len = length $ phaseEvents dat
-- putStrLn (show $ phaseEvents dat !! (len - 3))
-- putStrLn (show $ phaseEvents dat !! (len - 2))
-- putStrLn (show $ phaseEvents dat !! (len - 1))
--
-- getFirstPE dat = head $ phaseEvents dat
{- EOF. -}
ppEventType :: EventType -> String
ppEventType et = printf "%4d: %s (size %d)" (etNum et) (etDesc et) (etSize et)
ppEvent :: Event -> String
ppEvent Event{..} =
printf "%9d: cap %d: " ts (cap spec) ++
case spec of
CreateThread{..} -> printf "creating thread %d" thread
RunThread{..} -> printf "running thread %d" thread
StopThread{..} -> printf "stopping thread %d (%s)" thread (showThreadStopStatus status)
ThreadRunnable{..} -> printf "thread %d is runnable" thread
MigrateThread{..} -> printf "migrating thread %d to cap %d" thread newCap
RunSpark{..} -> printf "running a local spark (thread %d)" thread
StealSpark{..} -> printf "thread %d stealing a spark from cap %d" thread origCap
Shutdown{..} -> printf "shutting down"
WakeupThread{..} -> printf "waking up thread %d on cap %d" thread otherCap
RequestSeqGC{..} -> printf "requesting sequential GC"
RequestParGC{..} -> printf "requesting parallel GC"
StartGC{..} -> printf "starting GC"
EndGC{..} -> printf "finished GC"
showThreadStopStatus :: ThreadStopStatus -> String
showThreadStopStatus HeapOverflow = "heap overflow"
showThreadStopStatus StackOverflow = "stack overflow"
showThreadStopStatus ThreadYielding = "thread yielding"
showThreadStopStatus ThreadBlocked = "thread blocked"
showThreadStopStatus ThreadFinished = "thread finished"
showThreadStopStatus ForeignCall = "making a foreign call"