{-# OPTIONS_GHC -optc-DPROFILING #-} {-# LINE 1 "libraries/ghc-heap/GHC/Exts/Heap/FFIClosures_ProfilingEnabled.hsc" #-} {-# LANGUAGE CPP #-} {-# LANGUAGE MagicHash #-} module GHC.Exts.Heap.FFIClosures_ProfilingEnabled where -- See [hsc and CPP workaround] import Prelude import Foreign import GHC.Exts import GHC.Exts.Heap.ProfInfo.PeekProfInfo import GHC.Exts.Heap.ProfInfo.Types import GHC.Exts.Heap.Closures(WhatNext(..), WhyBlocked(..), TsoFlags(..)) data TSOFields = TSOFields { tso_what_next :: WhatNext, tso_why_blocked :: WhyBlocked, tso_flags :: [TsoFlags], -- Unfortunately block_info is a union without clear discriminator. -- block_info :: TDB, tso_threadId :: Word64, tso_saved_errno :: Word32, tso_dirty:: Word32, tso_alloc_limit :: Int64, tso_tot_stack_size :: Word32, tso_prof :: Maybe StgTSOProfInfo } -- | Get non-pointer fields from @StgTSO_@ (@TSO.h@) peekTSOFields :: (Ptr a -> IO (Maybe CostCentreStack)) -> Ptr tsoPtr -> IO TSOFields peekTSOFields decodeCCS ptr = do what_next' <- ((\hsc_ptr -> peekByteOff hsc_ptr 48)) ptr {-# LINE 36 "libraries/ghc-heap/GHC/Exts/Heap/FFIClosures_ProfilingEnabled.hsc" #-} why_blocked' <- ((\hsc_ptr -> peekByteOff hsc_ptr 50)) ptr {-# LINE 37 "libraries/ghc-heap/GHC/Exts/Heap/FFIClosures_ProfilingEnabled.hsc" #-} flags' <- ((\hsc_ptr -> peekByteOff hsc_ptr 52)) ptr {-# LINE 38 "libraries/ghc-heap/GHC/Exts/Heap/FFIClosures_ProfilingEnabled.hsc" #-} threadId' <- ((\hsc_ptr -> peekByteOff hsc_ptr 64)) ptr {-# LINE 39 "libraries/ghc-heap/GHC/Exts/Heap/FFIClosures_ProfilingEnabled.hsc" #-} saved_errno' <- ((\hsc_ptr -> peekByteOff hsc_ptr 72)) ptr {-# LINE 40 "libraries/ghc-heap/GHC/Exts/Heap/FFIClosures_ProfilingEnabled.hsc" #-} dirty' <- ((\hsc_ptr -> peekByteOff hsc_ptr 76)) ptr {-# LINE 41 "libraries/ghc-heap/GHC/Exts/Heap/FFIClosures_ProfilingEnabled.hsc" #-} alloc_limit' <- ((\hsc_ptr -> peekByteOff hsc_ptr 120)) ptr {-# LINE 42 "libraries/ghc-heap/GHC/Exts/Heap/FFIClosures_ProfilingEnabled.hsc" #-} tot_stack_size' <- ((\hsc_ptr -> peekByteOff hsc_ptr 128)) ptr {-# LINE 43 "libraries/ghc-heap/GHC/Exts/Heap/FFIClosures_ProfilingEnabled.hsc" #-} tso_prof' <- peekStgTSOProfInfo decodeCCS ptr return TSOFields { tso_what_next = parseWhatNext what_next', tso_why_blocked = parseWhyBlocked why_blocked', tso_flags = parseTsoFlags flags', tso_threadId = threadId', tso_saved_errno = saved_errno', tso_dirty = dirty', tso_alloc_limit = alloc_limit', tso_tot_stack_size = tot_stack_size', tso_prof = tso_prof' } parseWhatNext :: Word16 -> WhatNext parseWhatNext w = case w of (1) -> ThreadRunGHC {-# LINE 60 "libraries/ghc-heap/GHC/Exts/Heap/FFIClosures_ProfilingEnabled.hsc" #-} (2) -> ThreadInterpret {-# LINE 61 "libraries/ghc-heap/GHC/Exts/Heap/FFIClosures_ProfilingEnabled.hsc" #-} (3) -> ThreadKilled {-# LINE 62 "libraries/ghc-heap/GHC/Exts/Heap/FFIClosures_ProfilingEnabled.hsc" #-} (4) -> ThreadComplete {-# LINE 63 "libraries/ghc-heap/GHC/Exts/Heap/FFIClosures_ProfilingEnabled.hsc" #-} _ -> WhatNextUnknownValue w parseWhyBlocked :: Word16 -> WhyBlocked parseWhyBlocked w = case w of (0) -> NotBlocked {-# LINE 68 "libraries/ghc-heap/GHC/Exts/Heap/FFIClosures_ProfilingEnabled.hsc" #-} (1) -> BlockedOnMVar {-# LINE 69 "libraries/ghc-heap/GHC/Exts/Heap/FFIClosures_ProfilingEnabled.hsc" #-} (14) -> BlockedOnMVarRead {-# LINE 70 "libraries/ghc-heap/GHC/Exts/Heap/FFIClosures_ProfilingEnabled.hsc" #-} (2) -> BlockedOnBlackHole {-# LINE 71 "libraries/ghc-heap/GHC/Exts/Heap/FFIClosures_ProfilingEnabled.hsc" #-} (3) -> BlockedOnRead {-# LINE 72 "libraries/ghc-heap/GHC/Exts/Heap/FFIClosures_ProfilingEnabled.hsc" #-} (4) -> BlockedOnWrite {-# LINE 73 "libraries/ghc-heap/GHC/Exts/Heap/FFIClosures_ProfilingEnabled.hsc" #-} (5) -> BlockedOnDelay {-# LINE 74 "libraries/ghc-heap/GHC/Exts/Heap/FFIClosures_ProfilingEnabled.hsc" #-} (6) -> BlockedOnSTM {-# LINE 75 "libraries/ghc-heap/GHC/Exts/Heap/FFIClosures_ProfilingEnabled.hsc" #-} (7) -> BlockedOnDoProc {-# LINE 76 "libraries/ghc-heap/GHC/Exts/Heap/FFIClosures_ProfilingEnabled.hsc" #-} (10) -> BlockedOnCCall {-# LINE 77 "libraries/ghc-heap/GHC/Exts/Heap/FFIClosures_ProfilingEnabled.hsc" #-} (11) -> BlockedOnCCall_Interruptible {-# LINE 78 "libraries/ghc-heap/GHC/Exts/Heap/FFIClosures_ProfilingEnabled.hsc" #-} (12) -> BlockedOnMsgThrowTo {-# LINE 79 "libraries/ghc-heap/GHC/Exts/Heap/FFIClosures_ProfilingEnabled.hsc" #-} (13) -> ThreadMigrating {-# LINE 80 "libraries/ghc-heap/GHC/Exts/Heap/FFIClosures_ProfilingEnabled.hsc" #-} {-# LINE 81 "libraries/ghc-heap/GHC/Exts/Heap/FFIClosures_ProfilingEnabled.hsc" #-} (15) -> BlockedOnIOCompletion {-# LINE 82 "libraries/ghc-heap/GHC/Exts/Heap/FFIClosures_ProfilingEnabled.hsc" #-} {-# LINE 83 "libraries/ghc-heap/GHC/Exts/Heap/FFIClosures_ProfilingEnabled.hsc" #-} _ -> WhyBlockedUnknownValue w parseTsoFlags :: Word32 -> [TsoFlags] parseTsoFlags w | isSet (2) w = TsoLocked : parseTsoFlags (unset (2) w) {-# LINE 87 "libraries/ghc-heap/GHC/Exts/Heap/FFIClosures_ProfilingEnabled.hsc" #-} | isSet (4) w = TsoBlockx : parseTsoFlags (unset (4) w) {-# LINE 88 "libraries/ghc-heap/GHC/Exts/Heap/FFIClosures_ProfilingEnabled.hsc" #-} | isSet (8) w = TsoInterruptible : parseTsoFlags (unset (8) w) {-# LINE 89 "libraries/ghc-heap/GHC/Exts/Heap/FFIClosures_ProfilingEnabled.hsc" #-} | isSet (16) w = TsoStoppedOnBreakpoint : parseTsoFlags (unset (16) w) {-# LINE 90 "libraries/ghc-heap/GHC/Exts/Heap/FFIClosures_ProfilingEnabled.hsc" #-} | isSet (64) w = TsoMarked : parseTsoFlags (unset (64) w) {-# LINE 91 "libraries/ghc-heap/GHC/Exts/Heap/FFIClosures_ProfilingEnabled.hsc" #-} | isSet (128) w = TsoSqueezed : parseTsoFlags (unset (128) w) {-# LINE 92 "libraries/ghc-heap/GHC/Exts/Heap/FFIClosures_ProfilingEnabled.hsc" #-} | isSet (256) w = TsoAllocLimit : parseTsoFlags (unset (256) w) {-# LINE 93 "libraries/ghc-heap/GHC/Exts/Heap/FFIClosures_ProfilingEnabled.hsc" #-} parseTsoFlags 0 = [] parseTsoFlags w = [TsoFlagsUnknownValue w] isSet :: Word32 -> Word32 -> Bool isSet bitMask w = w .&. bitMask /= 0 unset :: Word32 -> Word32 -> Word32 unset bitMask w = w `xor` bitMask data StackFields = StackFields { stack_size :: Word32, stack_dirty :: Word8, {-# LINE 106 "libraries/ghc-heap/GHC/Exts/Heap/FFIClosures_ProfilingEnabled.hsc" #-} stack_marking :: Word8, {-# LINE 108 "libraries/ghc-heap/GHC/Exts/Heap/FFIClosures_ProfilingEnabled.hsc" #-} stack_sp :: Addr# } -- | Get non-closure fields from @StgStack_@ (@TSO.h@) peekStackFields :: Ptr a -> IO StackFields peekStackFields ptr = do stack_size' <- ((\hsc_ptr -> peekByteOff hsc_ptr 24)) ptr ::IO Word32 {-# LINE 115 "libraries/ghc-heap/GHC/Exts/Heap/FFIClosures_ProfilingEnabled.hsc" #-} dirty' <- ((\hsc_ptr -> peekByteOff hsc_ptr 28)) ptr {-# LINE 116 "libraries/ghc-heap/GHC/Exts/Heap/FFIClosures_ProfilingEnabled.hsc" #-} {-# LINE 117 "libraries/ghc-heap/GHC/Exts/Heap/FFIClosures_ProfilingEnabled.hsc" #-} marking' <- ((\hsc_ptr -> peekByteOff hsc_ptr 29)) ptr {-# LINE 118 "libraries/ghc-heap/GHC/Exts/Heap/FFIClosures_ProfilingEnabled.hsc" #-} {-# LINE 119 "libraries/ghc-heap/GHC/Exts/Heap/FFIClosures_ProfilingEnabled.hsc" #-} Ptr sp' <- ((\hsc_ptr -> peekByteOff hsc_ptr 32)) ptr {-# LINE 120 "libraries/ghc-heap/GHC/Exts/Heap/FFIClosures_ProfilingEnabled.hsc" #-} -- TODO decode the stack. return StackFields { stack_size = stack_size', stack_dirty = dirty', {-# LINE 127 "libraries/ghc-heap/GHC/Exts/Heap/FFIClosures_ProfilingEnabled.hsc" #-} stack_marking = marking', {-# LINE 129 "libraries/ghc-heap/GHC/Exts/Heap/FFIClosures_ProfilingEnabled.hsc" #-} stack_sp = sp' }