Add GHC.Stats.getGCStatsEnabled function (#5846)
authorPaolo Capriotti <p.capriotti@gmail.com>
Fri, 15 Jun 2012 16:13:16 +0000 (17:13 +0100)
committerPaolo Capriotti <p.capriotti@gmail.com>
Tue, 19 Jun 2012 13:36:24 +0000 (14:36 +0100)
Add getGCStatsEnabled function which checks whether GC stats have been
enabled (with `-T`, for example).

Make getGCStats throw an exception if called with GC stats disabled.

GHC/Stats.hsc

index 2020ddd..024d1b2 100644 (file)
 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.
 
@@ -76,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