packages feed

eventlog-live-0.8.0.0: src-lib/GHC/Eventlog/Live/Data/Capability.hs

{- |
Module      : GHC.Eventlog.Live.Data.Capability
Description : Reprsentation for capability data.
Stability   : experimental
Portability : portable
-}
module GHC.Eventlog.Live.Data.Capability (
  CapNo (..),
  evCapNo,
  fromCapabilityId,
) where

import Data.Word (Word16)
import GHC.Eventlog.Live.Data.Attribute (IsAttrValue)
import GHC.RTS.Events (Event (..))
import GHC.Stack.Profiler.Core.Eventlog (CapabilityId (..))

{- |
A capability number.

In the GHC RTS, all capabilities are assigned a `Word16` identifier.

In @ghc-events@, the event capability number is received as a `Word16`,
if present, and converted to an `Int`, using @-1@ for global events.

In @ghc-stack-profiler@, the capability number is added to the event,
and upcast to `Word64`.
-}
newtype CapNo = CapNo
  { value :: Word16
  }
  deriving (Show, Eq, Ord)
  deriving newtype (IsAttrValue)

{- |
Get the capability number from a @ghc-events@ `Event`.
-}
evCapNo :: Event -> Maybe CapNo
evCapNo ev
  | Just cap <- ev.evCap
  , 0 <= cap && cap <= fromIntegral @Word16 maxBound =
      Just (CapNo $ fromIntegral cap)
  | otherwise = Nothing

{- |
Get the capability number from a @ghc-stack-profiler@ `CapabilityId`.
-}
fromCapabilityId :: CapabilityId -> CapNo
fromCapabilityId (MkCapabilityId cap) = CapNo $ fromIntegral cap