content: {-# LANGUAGE BangPatterns #-}
  {-# LANGUAGE TupleSections #-}
  {-# LANGUAGE CPP #-}
  
  -- | Calculate the size of GHC.Stats statically.
  
  module Weigh.GHCStats
    (getGhcStatsSizeInBytes
    ,getStats
    ,gcCount
    ,totalBytesAllocated
    ,liveBytes
    ,maxBytesInUse
    ,maxOSBytes
    )
    where
  
  import Data.Word
  import GHC.Stats
  import System.Mem
  
  -- | Get GHC's statistics.
  getStats :: IO RTSStats
  getStats = getRTSStats
  
  gcCount :: RTSStats -> Word32
  gcCount = gcs
  
  totalBytesAllocated :: RTSStats -> Word64
  totalBytesAllocated = allocated_bytes
  
  liveBytes :: RTSStats -> Word64
  liveBytes = gcdetails_live_bytes . gc
  
  maxBytesInUse :: RTSStats -> Word64
  maxBytesInUse = max_live_bytes
  
  maxOSBytes :: RTSStats -> Word64
  maxOSBytes = max_mem_in_use_bytes
  
  -- | Get the size of a 'RTSStats' object in bytes.
  getGhcStatsSizeInBytes :: IO Word64
  getGhcStatsSizeInBytes = do
    s1 <- oneGetStats
    s2 <- twoGetStats
    return (fromIntegral (totalBytesAllocated s2 - totalBytesAllocated s1))
    where
      oneGetStats = do
        performGC
        !s <- getStats
        return s
      twoGetStats = do
        performGC
        !_ <- getStats
        !s <- getStats
        return s
  