{-# LANGUAGE CPP #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE MultiWayIf #-}
{-# OPTIONS_GHC -fsimpl-tick-factor=150 #-}
module GHC.RTS.Events (
EventLog(..),
Header(..),
Data(..),
EventType(..),
Event(..),
EventInfo(..),
ThreadStopStatus(..),
CapsetType(..),
HeapProfBreakdown(..),
HeapProfFlags(..),
Timestamp,
ThreadId,
TaskId,
KernelThreadId(..),
EventTypeNum,
EventTypeDesc,
EventTypeSize,
BlockSize,
Capset,
PID,
StringId,
ProcessId,
MachineId,
PortId,
MessageSize,
MessageTag(..),
ParConjDynId,
ParConjStaticId,
SparkId,
FutureId,
PerfEventTypeNum,
readEventLogFromFile,
writeEventLogToFile,
serialiseEventLog,
CapEvent(..), sortEvents,
buildEventTypeMap,
printEventsIncremental,
showEventInfo, buildEventInfo,
showThreadStopStatus,
ppEventLog, ppEventType,
ppEvent, buildEvent, buildEvent',
nEVENT_PERF_NAME, nEVENT_PERF_COUNTER, nEVENT_PERF_TRACEPOINT,
sz_perf_num, sz_kernel_tid,
spec,
time,
) where
import Control.Applicative
import Control.Concurrent hiding (ThreadId)
import qualified Data.Binary.Put as P
import qualified Data.ByteString as B
import qualified Data.ByteString.Char8 as B8
import qualified Data.ByteString.Lazy as BL
import Data.Char (isPrint)
import Data.IntMap (IntMap)
import qualified Data.IntMap as IM
import Data.Function hiding (id)
import Data.List
import Data.String (IsString)
import qualified Data.Text as T
import qualified Data.Text.Encoding as TE
import qualified Data.Text.Lazy as TL
import qualified Data.Text.Lazy.Builder as TB
import qualified Data.Text.Lazy.Builder.Int as TB
import qualified Data.Text.Lazy.IO as TL
import qualified Data.Vector.Unboxed as VU
import Data.Word
import System.IO
import Prelude hiding (gcd, rem, id)
import GHC.RTS.EventTypes
import GHC.RTS.Events.Binary
import GHC.RTS.Events.Incremental
#if !MIN_VERSION_base(4, 8, 0)
import Data.Foldable (foldMap)
import Data.Monoid (mempty)
#endif
#if !MIN_VERSION_base(4, 11, 0)
import Data.Monoid ((<>))
#endif
readEventLogFromFile :: FilePath -> IO (Either String EventLog)
readEventLogFromFile :: FilePath -> IO (Either FilePath EventLog)
readEventLogFromFile path :: FilePath
path = ((EventLog, Maybe FilePath) -> EventLog)
-> Either FilePath (EventLog, Maybe FilePath)
-> Either FilePath EventLog
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (EventLog, Maybe FilePath) -> EventLog
forall a b. (a, b) -> a
fst (Either FilePath (EventLog, Maybe FilePath)
-> Either FilePath EventLog)
-> (ByteString -> Either FilePath (EventLog, Maybe FilePath))
-> ByteString
-> Either FilePath EventLog
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Either FilePath (EventLog, Maybe FilePath)
readEventLog (ByteString -> Either FilePath EventLog)
-> IO ByteString -> IO (Either FilePath EventLog)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> FilePath -> IO ByteString
BL.readFile FilePath
path
printEventsIncremental
:: Bool
-> FilePath
-> IO ()
printEventsIncremental :: Bool -> FilePath -> IO ()
printEventsIncremental follow :: Bool
follow path :: FilePath
path =
FilePath -> IOMode -> (Handle -> IO ()) -> IO ()
forall r. FilePath -> IOMode -> (Handle -> IO r) -> IO r
withFile FilePath
path IOMode
ReadMode (Bool -> Handle -> IO ()
hPrintEventsIncremental Bool
follow)
hPrintEventsIncremental
:: Bool
-> Handle
-> IO ()
hPrintEventsIncremental :: Bool -> Handle -> IO ()
hPrintEventsIncremental follow :: Bool
follow hdl :: Handle
hdl = Decoder Event -> IO ()
go Decoder Event
decodeEventLog
where
go :: Decoder Event -> IO ()
go decoder :: Decoder Event
decoder = case Decoder Event
decoder of
Produce event :: Event
event decoder' :: Decoder Event
decoder' -> do
Handle -> Text -> IO ()
TL.hPutStrLn Handle
stdout (Text -> IO ()) -> Text -> IO ()
forall a b. (a -> b) -> a -> b
$ Builder -> Text
TB.toLazyText (Builder -> Text) -> Builder -> Text
forall a b. (a -> b) -> a -> b
$ Event -> Builder
buildEvent' Event
event
Decoder Event -> IO ()
go Decoder Event
decoder'
Consume k :: ByteString -> Decoder Event
k -> do
ByteString
chunk <- Handle -> Int -> IO ByteString
B.hGetSome Handle
hdl 4096
if
| Bool -> Bool
not (ByteString -> Bool
B.null ByteString
chunk) -> Decoder Event -> IO ()
go (Decoder Event -> IO ()) -> Decoder Event -> IO ()
forall a b. (a -> b) -> a -> b
$ ByteString -> Decoder Event
k ByteString
chunk
| Bool
follow -> Int -> IO ()
threadDelay 1000000 IO () -> IO () -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Decoder Event -> IO ()
go Decoder Event
decoder
| Bool
otherwise -> () -> IO ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
Done {} -> () -> IO ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
Error _ err :: FilePath
err -> FilePath -> IO ()
forall (m :: * -> *) a. MonadFail m => FilePath -> m a
fail FilePath
err
writeEventLogToFile :: FilePath -> EventLog -> IO ()
writeEventLogToFile :: FilePath -> EventLog -> IO ()
writeEventLogToFile fp :: FilePath
fp = FilePath -> ByteString -> IO ()
BL.writeFile FilePath
fp (ByteString -> IO ())
-> (EventLog -> ByteString) -> EventLog -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. EventLog -> ByteString
serialiseEventLog
serialiseEventLog :: EventLog -> BL.ByteString
serialiseEventLog :: EventLog -> ByteString
serialiseEventLog el :: EventLog
el@(EventLog _ (Data events :: [Event]
events)) =
Put -> ByteString
P.runPut (Put -> ByteString) -> Put -> ByteString
forall a b. (a -> b) -> a -> b
$ EventLog -> Put
putEventLog EventLog
blockedEl
where
eventsMap :: IntMap [Event]
eventsMap = [Event] -> IntMap [Event]
capSplitEvents [Event]
events
blockedEventsMap :: IntMap [Event]
blockedEventsMap = (Int -> [Event] -> [Event]) -> IntMap [Event] -> IntMap [Event]
forall a b. (Int -> a -> b) -> IntMap a -> IntMap b
IM.mapWithKey Int -> [Event] -> [Event]
addBlockMarker IntMap [Event]
eventsMap
blockedEl :: EventLog
blockedEl = EventLog
el{dat :: Data
dat = [Event] -> Data
Data [Event]
blockedEvents}
blockedEvents :: [Event]
blockedEvents = ([Event] -> [Event] -> [Event])
-> [Event] -> IntMap [Event] -> [Event]
forall a b. (a -> b -> b) -> b -> IntMap a -> b
IM.foldr [Event] -> [Event] -> [Event]
forall a. [a] -> [a] -> [a]
(++) [] IntMap [Event]
blockedEventsMap
getIntCap :: Event -> Int
getIntCap :: Event -> Int
getIntCap Event{evCap :: Event -> Maybe Int
evCap = Maybe Int
cap} =
case Maybe Int
cap of
Just capNo :: Int
capNo -> Int
capNo
Nothing -> -1
capSplitEvents :: [Event] -> IM.IntMap [Event]
capSplitEvents :: [Event] -> IntMap [Event]
capSplitEvents evts :: [Event]
evts = [Event] -> IntMap [Event] -> IntMap [Event]
capSplitEvents' [Event]
evts IntMap [Event]
forall a. IntMap a
IM.empty
capSplitEvents' :: [Event] -> IM.IntMap [Event] -> IM.IntMap [Event]
capSplitEvents' :: [Event] -> IntMap [Event] -> IntMap [Event]
capSplitEvents' evts :: [Event]
evts imap :: IntMap [Event]
imap =
case [Event]
evts of
(x :: Event
x:xs :: [Event]
xs) -> [Event] -> IntMap [Event] -> IntMap [Event]
capSplitEvents' [Event]
xs (([Event] -> [Event] -> [Event])
-> Int -> [Event] -> IntMap [Event] -> IntMap [Event]
forall a. (a -> a -> a) -> Int -> a -> IntMap a -> IntMap a
IM.insertWith [Event] -> [Event] -> [Event]
forall a. [a] -> [a] -> [a]
(++) (Event -> Int
getIntCap Event
x) [Event
x] IntMap [Event]
imap)
[] -> IntMap [Event]
imap
addBlockMarker :: Int -> [Event] -> [Event]
addBlockMarker :: Int -> [Event] -> [Event]
addBlockMarker cap :: Int
cap evts :: [Event]
evts =
(Timestamp -> EventInfo -> Maybe Int -> Event
Event Timestamp
startTime (Timestamp -> Int -> BlockSize -> EventInfo
EventBlock Timestamp
endTime Int
cap BlockSize
sz) (Int -> Maybe Int
mkCap Int
cap)) Event -> [Event] -> [Event]
forall a. a -> [a] -> [a]
: [Event]
sortedEvts
where
sz :: BlockSize
sz = Int64 -> BlockSize
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int64 -> BlockSize)
-> (ByteString -> Int64) -> ByteString -> BlockSize
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Int64
BL.length (ByteString -> BlockSize) -> ByteString -> BlockSize
forall a b. (a -> b) -> a -> b
$ Put -> ByteString
P.runPut (Put -> ByteString) -> Put -> ByteString
forall a b. (a -> b) -> a -> b
$ (Event -> Put) -> [Event] -> Put
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ Event -> Put
putEvent [Event]
evts
startTime :: Timestamp
startTime = case [Event]
sortedEvts of
(x :: Event
x:_) -> Event -> Timestamp
evTime Event
x
[] -> FilePath -> Timestamp
forall a. HasCallStack => FilePath -> a
error "Cannot add block marker to an empty list of events"
sortedEvts :: [Event]
sortedEvts = [Event] -> [Event]
sortEvents [Event]
evts
endTime :: Timestamp
endTime = Event -> Timestamp
evTime (Event -> Timestamp) -> Event -> Timestamp
forall a b. (a -> b) -> a -> b
$ [Event] -> Event
forall a. [a] -> a
last [Event]
sortedEvts
sortEvents :: [Event] -> [Event]
sortEvents :: [Event] -> [Event]
sortEvents = (Event -> Event -> Ordering) -> [Event] -> [Event]
forall a. (a -> a -> Ordering) -> [a] -> [a]
sortBy (Timestamp -> Timestamp -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (Timestamp -> Timestamp -> Ordering)
-> (Event -> Timestamp) -> Event -> Event -> Ordering
forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
`on` Event -> Timestamp
evTime)
buildEventTypeMap :: [EventType] -> IntMap EventType
buildEventTypeMap :: [EventType] -> IntMap EventType
buildEventTypeMap etypes :: [EventType]
etypes =
[(Int, EventType)] -> IntMap EventType
forall a. [(Int, a)] -> IntMap a
IM.fromList [ (EventTypeNum -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (EventType -> EventTypeNum
num EventType
t),EventType
t) | EventType
t <- [EventType]
etypes ]
showEventInfo :: EventInfo -> String
showEventInfo :: EventInfo -> FilePath
showEventInfo = Text -> FilePath
TL.unpack (Text -> FilePath) -> (EventInfo -> Text) -> EventInfo -> FilePath
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builder -> Text
TB.toLazyText (Builder -> Text) -> (EventInfo -> Builder) -> EventInfo -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. EventInfo -> Builder
buildEventInfo
buildEventInfo :: EventInfo -> TB.Builder
buildEventInfo :: EventInfo -> Builder
buildEventInfo spec' :: EventInfo
spec' =
case EventInfo
spec' of
EventBlock end_time :: Timestamp
end_time cap :: Int
cap _block_events :: BlockSize
_block_events ->
"event block: cap " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Int -> Builder
forall a. Integral a => a -> Builder
TB.decimal Int
cap
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> ", end time: " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Timestamp -> Builder
forall a. Integral a => a -> Builder
TB.decimal Timestamp
end_time Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> "\n"
Startup n_caps :: Int
n_caps ->
"startup: " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Int -> Builder
forall a. Integral a => a -> Builder
TB.decimal Int
n_caps Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> " capabilities"
CreateThread thread :: BlockSize
thread ->
"creating thread " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> BlockSize -> Builder
forall a. Integral a => a -> Builder
TB.decimal BlockSize
thread
RunThread thread :: BlockSize
thread ->
"running thread " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> BlockSize -> Builder
forall a. Integral a => a -> Builder
TB.decimal BlockSize
thread
StopThread thread :: BlockSize
thread status :: ThreadStopStatus
status ->
"stopping thread " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> BlockSize -> Builder
forall a. Integral a => a -> Builder
TB.decimal BlockSize
thread
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> " (" Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> FilePath -> Builder
TB.fromString (ThreadStopStatus -> FilePath
showThreadStopStatus ThreadStopStatus
status) Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> ")"
ThreadRunnable thread :: BlockSize
thread ->
"thread " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> BlockSize -> Builder
forall a. Integral a => a -> Builder
TB.decimal BlockSize
thread Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> " is runnable"
MigrateThread thread :: BlockSize
thread newCap :: Int
newCap ->
"migrating thread " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> BlockSize -> Builder
forall a. Integral a => a -> Builder
TB.decimal BlockSize
thread
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> " to cap " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Int -> Builder
forall a. Integral a => a -> Builder
TB.decimal Int
newCap
CreateSparkThread sparkThread :: BlockSize
sparkThread ->
"creating spark thread " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> BlockSize -> Builder
forall a. Integral a => a -> Builder
TB.decimal BlockSize
sparkThread
SparkCounters crt :: Timestamp
crt dud :: Timestamp
dud ovf :: Timestamp
ovf cnv :: Timestamp
cnv fiz :: Timestamp
fiz gcd :: Timestamp
gcd rem :: Timestamp
rem ->
"spark stats: "
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Timestamp -> Builder
forall a. Integral a => a -> Builder
TB.decimal Timestamp
crt Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> " created, "
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Timestamp -> Builder
forall a. Integral a => a -> Builder
TB.decimal Timestamp
cnv Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> " converted, "
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Timestamp -> Builder
forall a. Integral a => a -> Builder
TB.decimal Timestamp
rem Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> " remaining ("
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Timestamp -> Builder
forall a. Integral a => a -> Builder
TB.decimal Timestamp
ovf Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> " overflowed, "
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Timestamp -> Builder
forall a. Integral a => a -> Builder
TB.decimal Timestamp
dud Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> " dud, "
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Timestamp -> Builder
forall a. Integral a => a -> Builder
TB.decimal Timestamp
gcd Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> " GC'd, "
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Timestamp -> Builder
forall a. Integral a => a -> Builder
TB.decimal Timestamp
fiz Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> " fizzled)"
SparkCreate ->
"spark created"
SparkDud ->
"dud spark discarded"
SparkOverflow ->
"overflowed spark discarded"
SparkRun ->
"running a local spark"
SparkSteal victimCap :: Int
victimCap ->
"stealing a spark from cap " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Int -> Builder
forall a. Integral a => a -> Builder
TB.decimal Int
victimCap
SparkFizzle ->
"spark fizzled"
SparkGC ->
"spark GCed"
TaskCreate taskId :: Timestamp
taskId cap :: Int
cap tid :: KernelThreadId
tid ->
"task 0x" Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Timestamp -> Builder
forall a. Integral a => a -> Builder
TB.hexadecimal Timestamp
taskId
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> " created on cap " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Int -> Builder
forall a. Integral a => a -> Builder
TB.decimal Int
cap
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>" with OS kernel thread " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Timestamp -> Builder
forall a. Integral a => a -> Builder
TB.decimal (KernelThreadId -> Timestamp
kernelThreadId KernelThreadId
tid)
TaskMigrate taskId :: Timestamp
taskId cap :: Int
cap new_cap :: Int
new_cap ->
"task 0x" Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Timestamp -> Builder
forall a. Integral a => a -> Builder
TB.hexadecimal Timestamp
taskId
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> " migrated from cap " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Int -> Builder
forall a. Integral a => a -> Builder
TB.decimal Int
cap
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> " to cap " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Int -> Builder
forall a. Integral a => a -> Builder
TB.decimal Int
new_cap
TaskDelete taskId :: Timestamp
taskId ->
"task 0x" Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Timestamp -> Builder
forall a. Integral a => a -> Builder
TB.hexadecimal Timestamp
taskId Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> " deleted"
Shutdown ->
"shutting down"
WakeupThread thread :: BlockSize
thread otherCap :: Int
otherCap ->
"waking up thread " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> BlockSize -> Builder
forall a. Integral a => a -> Builder
TB.decimal BlockSize
thread
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> " on cap " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Int -> Builder
forall a. Integral a => a -> Builder
TB.decimal Int
otherCap
ThreadLabel thread :: BlockSize
thread label :: Text
label ->
"thread " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> BlockSize -> Builder
forall a. Integral a => a -> Builder
TB.decimal BlockSize
thread
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> " has label \"" Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Text -> Builder
TB.fromText Text
label Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> "\""
RequestSeqGC ->
"requesting sequential GC"
RequestParGC ->
"requesting parallel GC"
StartGC ->
"starting GC"
EndGC ->
"finished GC"
GCWork ->
"GC working"
GCIdle ->
"GC idle"
GCDone ->
"GC done"
GlobalSyncGC ->
"all caps stopped for GC"
GCStatsGHC{..} ->
"GC stats for heap capset " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> BlockSize -> Builder
forall a. Integral a => a -> Builder
TB.decimal BlockSize
heapCapset
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> ": generation " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Int -> Builder
forall a. Integral a => a -> Builder
TB.decimal Int
gen Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> ", "
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Timestamp -> Builder
forall a. Integral a => a -> Builder
TB.decimal Timestamp
copied Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> " bytes copied, "
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Timestamp -> Builder
forall a. Integral a => a -> Builder
TB.decimal Timestamp
slop Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> " bytes slop, "
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Timestamp -> Builder
forall a. Integral a => a -> Builder
TB.decimal Timestamp
frag Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> " bytes fragmentation, "
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Int -> Builder
forall a. Integral a => a -> Builder
TB.decimal Int
parNThreads Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> " par threads, "
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Timestamp -> Builder
forall a. Integral a => a -> Builder
TB.decimal Timestamp
parMaxCopied Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> " bytes max par copied, "
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Timestamp -> Builder
forall a. Integral a => a -> Builder
TB.decimal Timestamp
parTotCopied Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> " bytes total par copied"
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Builder -> (Timestamp -> Builder) -> Maybe Timestamp -> Builder
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Builder
forall a. Monoid a => a
mempty (\val :: Timestamp
val -> ", " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Timestamp -> Builder
forall a. Integral a => a -> Builder
TB.decimal Timestamp
val Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> " bytes balanced par copied") Maybe Timestamp
parBalancedCopied
HeapAllocated{..} ->
"allocated on heap capset " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> BlockSize -> Builder
forall a. Integral a => a -> Builder
TB.decimal BlockSize
heapCapset
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> ": " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Timestamp -> Builder
forall a. Integral a => a -> Builder
TB.decimal Timestamp
allocBytes Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> " total bytes till now"
HeapSize{..} ->
"size of heap capset " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> BlockSize -> Builder
forall a. Integral a => a -> Builder
TB.decimal BlockSize
heapCapset
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> ": " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Timestamp -> Builder
forall a. Integral a => a -> Builder
TB.decimal Timestamp
sizeBytes Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> " bytes"
HeapLive{..} ->
"live data in heap capset " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> BlockSize -> Builder
forall a. Integral a => a -> Builder
TB.decimal BlockSize
heapCapset
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> ": " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Timestamp -> Builder
forall a. Integral a => a -> Builder
TB.decimal Timestamp
liveBytes Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> " bytes"
HeapInfoGHC{..} ->
"heap stats for heap capset " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> BlockSize -> Builder
forall a. Integral a => a -> Builder
TB.decimal BlockSize
heapCapset
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> ": generations " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Int -> Builder
forall a. Integral a => a -> Builder
TB.decimal Int
gens Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> ", "
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Timestamp -> Builder
forall a. Integral a => a -> Builder
TB.decimal Timestamp
maxHeapSize Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> " bytes max heap size, "
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Timestamp -> Builder
forall a. Integral a => a -> Builder
TB.decimal Timestamp
allocAreaSize Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> " bytes alloc area size, "
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Timestamp -> Builder
forall a. Integral a => a -> Builder
TB.decimal Timestamp
mblockSize Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> " bytes mblock size, "
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Timestamp -> Builder
forall a. Integral a => a -> Builder
TB.decimal Timestamp
blockSize Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> " bytes block size"
CapCreate{Int
cap :: EventInfo -> Int
cap :: Int
cap} ->
"created cap " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Int -> Builder
forall a. Integral a => a -> Builder
TB.decimal Int
cap
CapDelete{Int
cap :: Int
cap :: EventInfo -> Int
cap} ->
"deleted cap " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Int -> Builder
forall a. Integral a => a -> Builder
TB.decimal Int
cap
CapDisable{Int
cap :: Int
cap :: EventInfo -> Int
cap} ->
"disabled cap " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Int -> Builder
forall a. Integral a => a -> Builder
TB.decimal Int
cap
CapEnable{Int
cap :: Int
cap :: EventInfo -> Int
cap} ->
"enabled cap " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Int -> Builder
forall a. Integral a => a -> Builder
TB.decimal Int
cap
Message msg :: Text
msg ->
Text -> Builder
TB.fromText Text
msg
UserMessage msg :: Text
msg ->
Text -> Builder
TB.fromText Text
msg
UserMarker markername :: Text
markername ->
"marker: " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Text -> Builder
TB.fromText Text
markername
CapsetCreate cs :: BlockSize
cs ct :: CapsetType
ct ->
"created capset " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> BlockSize -> Builder
forall a. Integral a => a -> Builder
TB.decimal BlockSize
cs
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> " of type " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> FilePath -> Builder
TB.fromString (CapsetType -> FilePath
forall a. Show a => a -> FilePath
show CapsetType
ct)
CapsetDelete cs :: BlockSize
cs ->
"deleted capset " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> BlockSize -> Builder
forall a. Integral a => a -> Builder
TB.decimal BlockSize
cs
CapsetAssignCap cs :: BlockSize
cs cp :: Int
cp ->
"assigned cap " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Int -> Builder
forall a. Integral a => a -> Builder
TB.decimal Int
cp Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> " to capset " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> BlockSize -> Builder
forall a. Integral a => a -> Builder
TB.decimal BlockSize
cs
CapsetRemoveCap cs :: BlockSize
cs cp :: Int
cp ->
"removed cap " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Int -> Builder
forall a. Integral a => a -> Builder
TB.decimal Int
cp Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> " from capset " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> BlockSize -> Builder
forall a. Integral a => a -> Builder
TB.decimal BlockSize
cs
OsProcessPid cs :: BlockSize
cs pid :: BlockSize
pid ->
"capset " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> BlockSize -> Builder
forall a. Integral a => a -> Builder
TB.decimal BlockSize
cs Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> ": pid " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> BlockSize -> Builder
forall a. Integral a => a -> Builder
TB.decimal BlockSize
pid
OsProcessParentPid cs :: BlockSize
cs ppid :: BlockSize
ppid ->
"capset " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> BlockSize -> Builder
forall a. Integral a => a -> Builder
TB.decimal BlockSize
cs Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> ": parent pid " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> BlockSize -> Builder
forall a. Integral a => a -> Builder
TB.decimal BlockSize
ppid
WallClockTime cs :: BlockSize
cs sec :: Timestamp
sec nsec :: BlockSize
nsec ->
"capset " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> BlockSize -> Builder
forall a. Integral a => a -> Builder
TB.decimal BlockSize
cs Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> ": wall clock time "
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Timestamp -> Builder
forall a. Integral a => a -> Builder
TB.decimal Timestamp
sec Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> "s "
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> BlockSize -> Builder
forall a. Integral a => a -> Builder
TB.decimal BlockSize
nsec Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> "ns (unix epoch)"
RtsIdentifier cs :: BlockSize
cs i :: Text
i ->
"capset " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> BlockSize -> Builder
forall a. Integral a => a -> Builder
TB.decimal BlockSize
cs
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> ": RTS version \"" Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Text -> Builder
TB.fromText Text
i Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> "\""
ProgramArgs cs :: BlockSize
cs args :: [Text]
args ->
"capset " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> BlockSize -> Builder
forall a. Integral a => a -> Builder
TB.decimal BlockSize
cs
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> ": args: " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> FilePath -> Builder
TB.fromString ([Text] -> FilePath
forall a. Show a => a -> FilePath
show [Text]
args)
ProgramEnv cs :: BlockSize
cs env :: [Text]
env ->
"capset " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> BlockSize -> Builder
forall a. Integral a => a -> Builder
TB.decimal BlockSize
cs
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> ": env: " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> FilePath -> Builder
TB.fromString ([Text] -> FilePath
forall a. Show a => a -> FilePath
show [Text]
env)
UnknownEvent n :: EventTypeNum
n ->
"Unknown event type " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> EventTypeNum -> Builder
forall a. Integral a => a -> Builder
TB.decimal EventTypeNum
n
InternString str :: FilePath
str sId :: BlockSize
sId ->
"Interned string: \"" Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> FilePath -> Builder
TB.fromString FilePath
str
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> "\" with id " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> BlockSize -> Builder
forall a. Integral a => a -> Builder
TB.decimal BlockSize
sId
Version version :: FilePath
version ->
"compiler version is " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> FilePath -> Builder
TB.fromString FilePath
version
ProgramInvocation commandline :: FilePath
commandline ->
"program invocation: " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> FilePath -> Builder
TB.fromString FilePath
commandline
EdenStartReceive ->
"starting to receive"
EdenEndReceive ->
"stop receiving"
CreateProcess process :: BlockSize
process ->
"creating process " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> BlockSize -> Builder
forall a. Integral a => a -> Builder
TB.decimal BlockSize
process
KillProcess process :: BlockSize
process ->
"killing process " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> BlockSize -> Builder
forall a. Integral a => a -> Builder
TB.decimal BlockSize
process
AssignThreadToProcess thread :: BlockSize
thread process :: BlockSize
process ->
"assigning thread " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> BlockSize -> Builder
forall a. Integral a => a -> Builder
TB.decimal BlockSize
thread
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> " to process " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> BlockSize -> Builder
forall a. Integral a => a -> Builder
TB.decimal BlockSize
process
CreateMachine machine :: EventTypeNum
machine realtime :: Timestamp
realtime ->
"creating machine " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> EventTypeNum -> Builder
forall a. Integral a => a -> Builder
TB.decimal EventTypeNum
machine
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> " at " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Timestamp -> Builder
forall a. Integral a => a -> Builder
TB.decimal Timestamp
realtime
KillMachine machine :: EventTypeNum
machine ->
"killing machine " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> EventTypeNum -> Builder
forall a. Integral a => a -> Builder
TB.decimal EventTypeNum
machine
SendMessage mesTag :: MessageTag
mesTag senderProcess :: BlockSize
senderProcess senderThread :: BlockSize
senderThread
receiverMachine :: EventTypeNum
receiverMachine receiverProcess :: BlockSize
receiverProcess receiverInport :: BlockSize
receiverInport ->
"sending message with tag " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> FilePath -> Builder
TB.fromString (MessageTag -> FilePath
forall a. Show a => a -> FilePath
show MessageTag
mesTag)
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> " from process " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> BlockSize -> Builder
forall a. Integral a => a -> Builder
TB.decimal BlockSize
senderProcess
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> ", thread " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> BlockSize -> Builder
forall a. Integral a => a -> Builder
TB.decimal BlockSize
senderThread
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> " to machine " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> EventTypeNum -> Builder
forall a. Integral a => a -> Builder
TB.decimal EventTypeNum
receiverMachine
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> ", process " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> BlockSize -> Builder
forall a. Integral a => a -> Builder
TB.decimal BlockSize
receiverProcess
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> " on inport " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> BlockSize -> Builder
forall a. Integral a => a -> Builder
TB.decimal BlockSize
receiverInport
ReceiveMessage mesTag :: MessageTag
mesTag receiverProcess :: BlockSize
receiverProcess receiverInport :: BlockSize
receiverInport
senderMachine :: EventTypeNum
senderMachine senderProcess :: BlockSize
senderProcess senderThread :: BlockSize
senderThread messageSize :: BlockSize
messageSize ->
"receiving message with tag " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> FilePath -> Builder
TB.fromString (MessageTag -> FilePath
forall a. Show a => a -> FilePath
show MessageTag
mesTag)
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> " at process " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> BlockSize -> Builder
forall a. Integral a => a -> Builder
TB.decimal BlockSize
receiverProcess
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> ", inport " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> BlockSize -> Builder
forall a. Integral a => a -> Builder
TB.decimal BlockSize
receiverInport
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> " from machine " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> EventTypeNum -> Builder
forall a. Integral a => a -> Builder
TB.decimal EventTypeNum
senderMachine
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> ", process " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> BlockSize -> Builder
forall a. Integral a => a -> Builder
TB.decimal BlockSize
senderProcess
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> ", thread " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> BlockSize -> Builder
forall a. Integral a => a -> Builder
TB.decimal BlockSize
senderThread
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> " with size " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> BlockSize -> Builder
forall a. Integral a => a -> Builder
TB.decimal BlockSize
messageSize
SendReceiveLocalMessage mesTag :: MessageTag
mesTag senderProcess :: BlockSize
senderProcess senderThread :: BlockSize
senderThread
receiverProcess :: BlockSize
receiverProcess receiverInport :: BlockSize
receiverInport ->
"sending/receiving message with tag " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> FilePath -> Builder
TB.fromString (MessageTag -> FilePath
forall a. Show a => a -> FilePath
show MessageTag
mesTag)
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> " from process " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> BlockSize -> Builder
forall a. Integral a => a -> Builder
TB.decimal BlockSize
senderProcess
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> ", thread " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> BlockSize -> Builder
forall a. Integral a => a -> Builder
TB.decimal BlockSize
senderThread
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> " to process " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> BlockSize -> Builder
forall a. Integral a => a -> Builder
TB.decimal BlockSize
receiverProcess
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> " on inport " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> BlockSize -> Builder
forall a. Integral a => a -> Builder
TB.decimal BlockSize
receiverInport
MerStartParConjunction dyn_id :: Timestamp
dyn_id static_id :: BlockSize
static_id ->
"Start a parallel conjunction 0x" Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Timestamp -> Builder
forall a. Integral a => a -> Builder
TB.hexadecimal Timestamp
dyn_id
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> ", static_id: " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> BlockSize -> Builder
forall a. Integral a => a -> Builder
TB.decimal BlockSize
static_id
MerEndParConjunction dyn_id :: Timestamp
dyn_id ->
"End par conjunction: 0x" Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Timestamp -> Builder
forall a. Integral a => a -> Builder
TB.hexadecimal Timestamp
dyn_id
MerEndParConjunct dyn_id :: Timestamp
dyn_id ->
"End par conjunct: 0x" Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Timestamp -> Builder
forall a. Integral a => a -> Builder
TB.hexadecimal Timestamp
dyn_id
MerCreateSpark dyn_id :: Timestamp
dyn_id spark_id :: BlockSize
spark_id ->
"Create spark for conjunction: 0x" Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Timestamp -> Builder
forall a. Integral a => a -> Builder
TB.hexadecimal Timestamp
dyn_id
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> " spark: 0x" Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> BlockSize -> Builder
forall a. Integral a => a -> Builder
TB.hexadecimal BlockSize
spark_id
MerFutureCreate future_id :: Timestamp
future_id name_id :: BlockSize
name_id ->
"Create future 0x" Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Timestamp -> Builder
forall a. Integral a => a -> Builder
TB.hexadecimal Timestamp
future_id
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> " named " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> BlockSize -> Builder
forall a. Integral a => a -> Builder
TB.decimal BlockSize
name_id
MerFutureWaitNosuspend future_id :: Timestamp
future_id ->
"Wait didn't suspend for future: 0x" Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Timestamp -> Builder
forall a. Integral a => a -> Builder
TB.hexadecimal Timestamp
future_id
MerFutureWaitSuspended future_id :: Timestamp
future_id ->
"Wait suspended on future: 0x" Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Timestamp -> Builder
forall a. Integral a => a -> Builder
TB.hexadecimal Timestamp
future_id
MerFutureSignal future_id :: Timestamp
future_id ->
"Signaled future 0x" Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Timestamp -> Builder
forall a. Integral a => a -> Builder
TB.hexadecimal Timestamp
future_id
MerLookingForGlobalThread ->
"Looking for global thread to resume"
MerWorkStealing ->
"Trying to steal a spark"
MerLookingForLocalSpark ->
"Looking for a local spark to execute"
MerReleaseThread thread_id :: BlockSize
thread_id ->
"Releasing thread " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> BlockSize -> Builder
forall a. Integral a => a -> Builder
TB.decimal BlockSize
thread_id Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> " to the free pool"
MerCapSleeping ->
"Capability going to sleep"
MerCallingMain ->
"About to call the program entry point"
PerfName{BlockSize
perfNum :: EventInfo -> BlockSize
perfNum :: BlockSize
perfNum, Text
name :: EventInfo -> Text
name :: Text
name} ->
"perf event " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> BlockSize -> Builder
forall a. Integral a => a -> Builder
TB.decimal BlockSize
perfNum
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> " named \"" Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Text -> Builder
TB.fromText Text
name Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> "\""
PerfCounter{BlockSize
perfNum :: BlockSize
perfNum :: EventInfo -> BlockSize
perfNum, KernelThreadId
tid :: EventInfo -> KernelThreadId
tid :: KernelThreadId
tid, Timestamp
period :: EventInfo -> Timestamp
period :: Timestamp
period} ->
"perf event counter " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> BlockSize -> Builder
forall a. Integral a => a -> Builder
TB.decimal BlockSize
perfNum
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> " incremented by " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Timestamp -> Builder
forall a. Integral a => a -> Builder
TB.decimal (Timestamp
period Timestamp -> Timestamp -> Timestamp
forall a. Num a => a -> a -> a
+ 1)
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> " in OS thread " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Timestamp -> Builder
forall a. Integral a => a -> Builder
TB.decimal (KernelThreadId -> Timestamp
kernelThreadId KernelThreadId
tid)
PerfTracepoint{BlockSize
perfNum :: BlockSize
perfNum :: EventInfo -> BlockSize
perfNum, KernelThreadId
tid :: KernelThreadId
tid :: EventInfo -> KernelThreadId
tid} ->
"perf event tracepoint " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> BlockSize -> Builder
forall a. Integral a => a -> Builder
TB.decimal BlockSize
perfNum
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> " reached in OS thread " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Timestamp -> Builder
forall a. Integral a => a -> Builder
TB.decimal (KernelThreadId -> Timestamp
kernelThreadId KernelThreadId
tid)
HeapProfBegin {..} ->
"start heap profiling " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Word8 -> Builder
forall a. Integral a => a -> Builder
TB.decimal Word8
heapProfId
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> " at sampling period " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Timestamp -> Builder
forall a. Integral a => a -> Builder
TB.decimal Timestamp
heapProfSamplingPeriod
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> " broken down by " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> HeapProfBreakdown -> Builder
forall s. IsString s => HeapProfBreakdown -> s
showHeapProfBreakdown HeapProfBreakdown
heapProfBreakdown
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Builder -> (Builder -> Builder) -> Maybe Builder -> Builder
forall b a. b -> (a -> b) -> Maybe a -> b
maybe "" (" filtered by " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>)
([Text] -> Maybe Builder
buildFilters
[ Text
heapProfModuleFilter
, Text
heapProfClosureDescrFilter
, Text
heapProfTypeDescrFilter
, Text
heapProfCostCentreFilter
, Text
heapProfCostCentreStackFilter
, Text
heapProfRetainerFilter
, Text
heapProfBiographyFilter
])
HeapProfCostCentre {..} ->
"cost centre " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> BlockSize -> Builder
forall a. Integral a => a -> Builder
TB.decimal BlockSize
heapProfCostCentreId
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> " " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Text -> Builder
TB.fromText Text
heapProfLabel
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> " in " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Text -> Builder
TB.fromText Text
heapProfModule
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> " at " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Text -> Builder
TB.fromText Text
heapProfSrcLoc
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> if HeapProfFlags -> Bool
isCaf HeapProfFlags
heapProfFlags then " CAF" else ""
HeapProfSampleBegin {..} ->
"start heap prof sample " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Timestamp -> Builder
forall a. Integral a => a -> Builder
TB.decimal Timestamp
heapProfSampleEra
HeapProfSampleEnd {..} ->
"end prof sample " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Timestamp -> Builder
forall a. Integral a => a -> Builder
TB.decimal Timestamp
heapProfSampleEra
HeapBioProfSampleBegin {..} ->
"start heap prof sample " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Timestamp -> Builder
forall a. Integral a => a -> Builder
TB.decimal Timestamp
heapProfSampleEra
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> " at time " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Timestamp -> Builder
forall a. Integral a => a -> Builder
TB.decimal Timestamp
heapProfSampleTime
HeapProfSampleCostCentre {..} ->
"heap prof sample " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Word8 -> Builder
forall a. Integral a => a -> Builder
TB.decimal Word8
heapProfId
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> ", residency " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Timestamp -> Builder
forall a. Integral a => a -> Builder
TB.decimal Timestamp
heapProfResidency
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> ", cost centre stack " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Vector BlockSize -> Builder
buildCostCentreStack Vector BlockSize
heapProfStack
HeapProfSampleString {..} ->
"heap prof sample " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Word8 -> Builder
forall a. Integral a => a -> Builder
TB.decimal Word8
heapProfId
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> ", residency " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Timestamp -> Builder
forall a. Integral a => a -> Builder
TB.decimal Timestamp
heapProfResidency
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> ", label " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Text -> Builder
TB.fromText Text
heapProfLabel
ProfSampleCostCentre {..} ->
"cap no " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> BlockSize -> Builder
forall a. Integral a => a -> Builder
TB.decimal BlockSize
profCapset
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> ", prof sample " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Timestamp -> Builder
forall a. Integral a => a -> Builder
TB.decimal Timestamp
profTicks
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> ", cost centre stack " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Vector BlockSize -> Builder
buildCostCentreStack Vector BlockSize
profCcsStack
ProfBegin {..} ->
"start time profiling, tick interval " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Timestamp -> Builder
forall a. Integral a => a -> Builder
TB.decimal Timestamp
profTickInterval Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> " (ns)"
UserBinaryMessage {..} ->
"binary message " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Text -> Builder
TB.fromText (Char -> ByteString -> Text
replaceUnprintableWith '.' ByteString
payload)
replaceUnprintableWith
:: Char
-> B.ByteString
-> T.Text
replaceUnprintableWith :: Char -> ByteString -> Text
replaceUnprintableWith replacement :: Char
replacement = ByteString -> Text
TE.decodeUtf8 (ByteString -> Text)
-> (ByteString -> ByteString) -> ByteString -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Char -> Char) -> ByteString -> ByteString
B8.map Char -> Char
replace
where
replace :: Char -> Char
replace c :: Char
c
| Char -> Bool
isPrint Char
c = Char
c
| Bool
otherwise = Char
replacement
buildFilters :: [T.Text] -> Maybe TB.Builder
buildFilters :: [Text] -> Maybe Builder
buildFilters = (Text -> Maybe Builder -> Maybe Builder)
-> Maybe Builder -> [Text] -> Maybe Builder
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr Text -> Maybe Builder -> Maybe Builder
g Maybe Builder
forall a. Maybe a
Nothing
where
g :: Text -> Maybe Builder -> Maybe Builder
g f :: Text
f b :: Maybe Builder
b
| Text -> Bool
T.null Text
f = Maybe Builder
b
| Bool
otherwise = Builder -> Maybe Builder
forall a. a -> Maybe a
Just (Text -> Builder
TB.fromText Text
f Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> ", ") Maybe Builder -> Maybe Builder -> Maybe Builder
forall a. Semigroup a => a -> a -> a
<> Maybe Builder
b
buildCostCentreStack :: VU.Vector Word32 -> TB.Builder
buildCostCentreStack :: Vector BlockSize -> Builder
buildCostCentreStack = (Builder -> Int -> BlockSize -> Builder)
-> Builder -> Vector BlockSize -> Builder
forall b a. Unbox b => (a -> Int -> b -> a) -> a -> Vector b -> a
VU.ifoldl' Builder -> Int -> BlockSize -> Builder
forall a a.
(Integral a, Num a, Eq a) =>
Builder -> a -> a -> Builder
go ""
where
go :: Builder -> a -> a -> Builder
go b :: Builder
b i :: a
i cc :: a
cc
| a
i a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== 0 = a -> Builder
forall a. Integral a => a -> Builder
TB.decimal a
cc
| Bool
otherwise = Builder
b Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> ", " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> a -> Builder
forall a. Integral a => a -> Builder
TB.decimal a
cc
showThreadStopStatus :: ThreadStopStatus -> String
showThreadStopStatus :: ThreadStopStatus -> FilePath
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"
showThreadStopStatus BlockedOnMVar = "blocked on an MVar"
showThreadStopStatus BlockedOnMVarRead = "blocked reading an MVar"
showThreadStopStatus BlockedOnBlackHole = "blocked on a black hole"
showThreadStopStatus BlockedOnRead = "blocked on I/O read"
showThreadStopStatus BlockedOnWrite = "blocked on I/O write"
showThreadStopStatus BlockedOnDelay = "blocked on threadDelay"
showThreadStopStatus BlockedOnSTM = "blocked in STM retry"
showThreadStopStatus BlockedOnDoProc = "blocked on asyncDoProc"
showThreadStopStatus BlockedOnCCall = "blocked in a foreign call"
showThreadStopStatus BlockedOnCCall_NoUnblockExc = "blocked in a foreign call"
showThreadStopStatus BlockedOnMsgThrowTo = "blocked in throwTo"
showThreadStopStatus ThreadMigrating = "thread migrating"
showThreadStopStatus BlockedOnMsgGlobalise = "waiting for data to be globalised"
showThreadStopStatus (BlockedOnBlackHoleOwnedBy target :: BlockSize
target) =
"blocked on black hole owned by thread " FilePath -> FilePath -> FilePath
forall a. [a] -> [a] -> [a]
++ BlockSize -> FilePath
forall a. Show a => a -> FilePath
show BlockSize
target
showThreadStopStatus NoStatus = "No stop thread status"
showHeapProfBreakdown :: IsString s => HeapProfBreakdown -> s
showHeapProfBreakdown :: HeapProfBreakdown -> s
showHeapProfBreakdown breakdown :: HeapProfBreakdown
breakdown = case HeapProfBreakdown
breakdown of
HeapProfBreakdownCostCentre -> "cost centre"
HeapProfBreakdownModule -> "module"
HeapProfBreakdownClosureDescr -> "closure description"
HeapProfBreakdownTypeDescr -> "type description"
HeapProfBreakdownRetainer -> "retainer"
HeapProfBreakdownBiography -> "biography"
HeapProfBreakdownClosureType -> "closure type"
ppEventLog :: EventLog -> String
ppEventLog :: EventLog -> FilePath
ppEventLog = Text -> FilePath
TL.unpack (Text -> FilePath) -> (EventLog -> Text) -> EventLog -> FilePath
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builder -> Text
TB.toLazyText (Builder -> Text) -> (EventLog -> Builder) -> EventLog -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. EventLog -> Builder
buildEventLog
buildEventLog :: EventLog -> TB.Builder
buildEventLog :: EventLog -> Builder
buildEventLog (EventLog (Header ets :: [EventType]
ets) (Data es :: [Event]
es)) =
"Event Types:\n"
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> (EventType -> Builder) -> [EventType] -> Builder
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap (\evType :: EventType
evType -> EventType -> Builder
buildEventType EventType
evType Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> "\n") [EventType]
ets
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> "\n"
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> "Events:\n"
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> (Event -> Builder) -> [Event] -> Builder
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap (\ev :: Event
ev -> IntMap EventType -> Event -> Builder
buildEvent IntMap EventType
imap Event
ev Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> "\n") [Event]
sorted
where
imap :: IntMap EventType
imap = [EventType] -> IntMap EventType
buildEventTypeMap [EventType]
ets
sorted :: [Event]
sorted = [Event] -> [Event]
sortEvents [Event]
es
ppEventType :: EventType -> String
ppEventType :: EventType -> FilePath
ppEventType = Text -> FilePath
TL.unpack (Text -> FilePath) -> (EventType -> Text) -> EventType -> FilePath
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builder -> Text
TB.toLazyText (Builder -> Text) -> (EventType -> Builder) -> EventType -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. EventType -> Builder
buildEventType
buildEventType :: EventType -> TB.Builder
buildEventType :: EventType -> Builder
buildEventType (EventType num :: EventTypeNum
num dsc :: Text
dsc msz :: Maybe EventTypeNum
msz) =
EventTypeNum -> Builder
forall a. Integral a => a -> Builder
TB.decimal EventTypeNum
num Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> ": "
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Text -> Builder
TB.fromText Text
dsc Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> " (size "
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Builder
-> (EventTypeNum -> Builder) -> Maybe EventTypeNum -> Builder
forall b a. b -> (a -> b) -> Maybe a -> b
maybe "variable" EventTypeNum -> Builder
forall a. Integral a => a -> Builder
TB.decimal Maybe EventTypeNum
msz Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> ")"
ppEvent :: IntMap EventType -> Event -> String
ppEvent :: IntMap EventType -> Event -> FilePath
ppEvent imap :: IntMap EventType
imap = Text -> FilePath
TL.unpack (Text -> FilePath) -> (Event -> Text) -> Event -> FilePath
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builder -> Text
TB.toLazyText (Builder -> Text) -> (Event -> Builder) -> Event -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IntMap EventType -> Event -> Builder
buildEvent IntMap EventType
imap
buildEvent :: IntMap EventType -> Event -> TB.Builder
buildEvent :: IntMap EventType -> Event -> Builder
buildEvent imap :: IntMap EventType
imap Event {..} =
Timestamp -> Builder
forall a. Integral a => a -> Builder
TB.decimal Timestamp
evTime
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> ": "
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Builder -> (Int -> Builder) -> Maybe Int -> Builder
forall b a. b -> (a -> b) -> Maybe a -> b
maybe "" (\c :: Int
c -> "cap " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Int -> Builder
forall a. Integral a => a -> Builder
TB.decimal Int
c Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> ": ") Maybe Int
evCap
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> case EventInfo
evSpec of
UnknownEvent{ ref :: EventInfo -> EventTypeNum
ref=EventTypeNum
ref } ->
Builder -> (EventType -> Builder) -> Maybe EventType -> Builder
forall b a. b -> (a -> b) -> Maybe a -> b
maybe "" (Text -> Builder
TB.fromText (Text -> Builder) -> (EventType -> Text) -> EventType -> Builder
forall b c a. (b -> c) -> (a -> b) -> a -> c
. EventType -> Text
desc) (Maybe EventType -> Builder) -> Maybe EventType -> Builder
forall a b. (a -> b) -> a -> b
$ Int -> IntMap EventType -> Maybe EventType
forall a. Int -> IntMap a -> Maybe a
IM.lookup (EventTypeNum -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral EventTypeNum
ref) IntMap EventType
imap
_ -> EventInfo -> Builder
buildEventInfo EventInfo
evSpec
buildEvent' :: Event -> TB.Builder
buildEvent' :: Event -> Builder
buildEvent' Event {..} =
Timestamp -> Builder
forall a. Integral a => a -> Builder
TB.decimal Timestamp
evTime
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> ": "
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Builder -> (Int -> Builder) -> Maybe Int -> Builder
forall b a. b -> (a -> b) -> Maybe a -> b
maybe "" (\c :: Int
c -> "cap " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Int -> Builder
forall a. Integral a => a -> Builder
TB.decimal Int
c Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> ": ") Maybe Int
evCap
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> case EventInfo
evSpec of
UnknownEvent{ ref :: EventInfo -> EventTypeNum
ref=EventTypeNum
ref } ->
"Unknown Event (ref: " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> EventTypeNum -> Builder
forall a. Integral a => a -> Builder
TB.decimal EventTypeNum
ref Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> ")"
_ -> EventInfo -> Builder
buildEventInfo EventInfo
evSpec