Implement tryAtomicReadMVar.
[packages/base.git] / GHC / Stats.hsc
index 92b33e2..024d1b2 100644 (file)
@@ -4,19 +4,31 @@
 {-# LANGUAGE RecordWildCards #-}
 {-# OPTIONS_GHC -funbox-strict-fields #-}
 
+-----------------------------------------------------------------------------
+-- | This module provides access to internal garbage collection and
+-- memory usage statistics.  These statistics are not available unless
+-- a program is run with the @-T@ RTS flag.
+--
+-- This module is GHC-only and should not be considered portable.
+--
+-----------------------------------------------------------------------------
 module GHC.Stats
     ( GCStats(..)
     , getGCStats
+    , getGCStatsEnabled
 ) where
 
+import Control.Monad
+import Data.Int
+import GHC.IO.Exception
 import Foreign.Marshal.Alloc
 import Foreign.Storable
 import Foreign.Ptr
-import Data.Int
 
 #include "Rts.h"
 
-foreign import ccall "getGCStats"    getGCStats_    :: Ptr () -> IO ()
+foreign import ccall "getGCStats"        getGCStats_       :: Ptr () -> IO ()
+foreign import ccall "getGCStatsEnabled" getGCStatsEnabled :: IO Bool
 
 -- I'm probably violating a bucket of constraints here... oops.
 
@@ -50,9 +62,9 @@ data GCStats = GCStats
     -- lists held by the capabilities.  Can be used with
     -- 'parMaxBytesCopied' to determine how well parallel GC utilized
     -- all cores.
-    , parAvgBytesCopied :: !Int64
+    , parTotBytesCopied :: !Int64
     -- | Sum of number of bytes copied each GC by the most active GC
-    -- thread each GC.  The ratio of 'parAvgBytesCopied' divided by
+    -- thread each GC.  The ratio of 'parTotBytesCopied' divided by
     -- 'parMaxBytesCopied' approaches 1 for a maximally sequential
     -- run and approaches the number of threads (set by the RTS flag
     -- @-N@) for a maximally parallel run.
@@ -68,7 +80,16 @@ data GCStats = GCStats
 -- garbage collection.  If you would like your statistics as recent as
 -- possible, first run a 'System.Mem.performGC'.
 getGCStats :: IO GCStats
-getGCStats = allocaBytes (#size GCStats) $ \p -> do
+getGCStats = do
+  statsEnabled <- getGCStatsEnabled
+  unless statsEnabled .  ioError $ IOError
+    Nothing
+    UnsupportedOperation
+    ""
+    "getGCStats: GC stats not enabled. Use `+RTS -T -RTS' to enable them."
+    Nothing
+    Nothing
+  allocaBytes (#size GCStats) $ \p -> do
     getGCStats_ p
     bytesAllocated <- (# peek GCStats, bytes_allocated) p
     numGcs <- (# peek GCStats, num_gcs ) p
@@ -90,7 +111,7 @@ getGCStats = allocaBytes (#size GCStats) $ \p -> do
     gcWallSeconds <- (# peek GCStats, gc_wall_seconds) p
     cpuSeconds <- (# peek GCStats, cpu_seconds) p
     wallSeconds <- (# peek GCStats, wall_seconds) p
-    parAvgBytesCopied <- (# peek GCStats, par_avg_bytes_copied) p
+    parTotBytesCopied <- (# peek GCStats, par_tot_bytes_copied) p
     parMaxBytesCopied <- (# peek GCStats, par_max_bytes_copied) p
     return GCStats { .. }