{-# LANGUAGE ForeignFunctionInterface #-} {-# LANGUAGE TemplateHaskell #-} module Main where import Control.Monad (forM_, when) import qualified System.Clock as Clock import Foreign.Ptr (Ptr) import GHC.GC_Hook foreign import ccall "get_my_delegate_ptr" c_get_my_delegate_ptr :: IO (Ptr ()) $(return []) {-# NOINLINE invokeGCsometimes #-} invokeGCsometimes :: IO () invokeGCsometimes = forM_ [1..10] $ \i -> do let l = [i..10000] print (sum l + product l + length l) main :: IO () main = do setGCHook invokeGCsometimes enabletm <- Clock.getTime Clock.Monotonic enableGClogging True invokeGCsometimes gclog <- getGCLog when (length gclog == 0) $ fail "GC log was unexpectedly empty" when (any ((< enabletm) . detTimestamp) gclog) $ do _ <- fail "Logging was already on before enableGClogging" print enabletm putStrLn "--" mapM_ print (map detTimestamp gclog) c_get_my_delegate_ptr >>= gcSetHookDelegate invokeGCsometimes