diff options
author | Matthew Pickering <matthewtpickering@gmail.com> | 2020-12-07 13:19:28 +0000 |
---|---|---|
committer | Marge Bot <ben+marge-bot@smart-cactus.org> | 2021-03-03 08:12:29 -0500 |
commit | d89deeba47ce04a5198a71fa4cbc203fe2c90794 (patch) | |
tree | 8f879bbb0774ce686e1688cc638ef22179babf51 /libraries/base/GHC | |
parent | d8dc0f96237fe6fe7081c04727c7c2573477e5cb (diff) | |
download | haskell-d89deeba47ce04a5198a71fa4cbc203fe2c90794.tar.gz |
Profiling: Allow heap profiling to be controlled dynamically.
This patch exposes three new functions in `GHC.Profiling` which allow
heap profiling to be enabled and disabled dynamically.
1. startHeapProfTimer - Starts heap profiling with the given RTS options
2. stopHeapProfTimer - Stops heap profiling
3. requestHeapCensus - Perform a heap census on the next context
switch, regardless of whether the timer is enabled or not.
Diffstat (limited to 'libraries/base/GHC')
-rw-r--r-- | libraries/base/GHC/Profiling.hs | 32 | ||||
-rw-r--r-- | libraries/base/GHC/RTS/Flags.hsc | 3 |
2 files changed, 34 insertions, 1 deletions
diff --git a/libraries/base/GHC/Profiling.hs b/libraries/base/GHC/Profiling.hs index 917a208b30..b7cef2fecd 100644 --- a/libraries/base/GHC/Profiling.hs +++ b/libraries/base/GHC/Profiling.hs @@ -2,7 +2,14 @@ {-# LANGUAGE NoImplicitPrelude #-} -- | @since 4.7.0.0 -module GHC.Profiling where +module GHC.Profiling ( -- * Cost Centre Profiling + startProfTimer + , stopProfTimer + -- * Heap Profiling + , startHeapProfTimer + , stopHeapProfTimer + , requestHeapCensus + )where import GHC.Base @@ -17,3 +24,26 @@ foreign import ccall stopProfTimer :: IO () -- -- @since 4.7.0.0 foreign import ccall startProfTimer :: IO () + +-- | Request a heap census on the next context switch. The census can be +-- requested whether or not the heap profiling timer is running. +-- Note: This won't do anything unless you also specify a profiling mode on the +-- command line using the normal RTS options. +-- +-- @since 4.16.0.0 +foreign import ccall requestHeapCensus :: IO () + +-- | Start heap profiling. This is called normally by the RTS on start-up, +-- but can be disabled using the rts flag `--no-automatic-heap-samples` +-- Note: This won't do anything unless you also specify a profiling mode on the +-- command line using the normal RTS options. +-- +-- @since 4.16.0.0 +foreign import ccall startHeapProfTimer :: IO () + +-- | Stop heap profiling. +-- Note: This won't do anything unless you also specify a profiling mode on the +-- command line using the normal RTS options. +-- +-- @since 4.16.0.0 +foreign import ccall stopHeapProfTimer :: IO () diff --git a/libraries/base/GHC/RTS/Flags.hsc b/libraries/base/GHC/RTS/Flags.hsc index 2130ee1aaa..2f161c72c3 100644 --- a/libraries/base/GHC/RTS/Flags.hsc +++ b/libraries/base/GHC/RTS/Flags.hsc @@ -288,6 +288,7 @@ data ProfFlags = ProfFlags { doHeapProfile :: DoHeapProfile , heapProfileInterval :: RtsTime -- ^ time between samples , heapProfileIntervalTicks :: Word -- ^ ticks between samples (derived) + , startHeapProfileAtStartup :: Bool , showCCSOnException :: Bool , maxRetainerSetSize :: Word , ccsLength :: Word @@ -584,6 +585,8 @@ getProfFlags = do <*> #{peek PROFILING_FLAGS, heapProfileInterval} ptr <*> #{peek PROFILING_FLAGS, heapProfileIntervalTicks} ptr <*> (toBool <$> + (#{peek PROFILING_FLAGS, startHeapProfileAtStartup} ptr :: IO CBool)) + <*> (toBool <$> (#{peek PROFILING_FLAGS, showCCSOnException} ptr :: IO CBool)) <*> #{peek PROFILING_FLAGS, maxRetainerSetSize} ptr <*> #{peek PROFILING_FLAGS, ccsLength} ptr |