diff options
author | Ben Gamari <bgamari.foss@gmail.com> | 2017-09-19 09:51:01 -0400 |
---|---|---|
committer | Ben Gamari <ben@smart-cactus.org> | 2017-09-19 13:37:46 -0400 |
commit | 6252292d4f4061f6e55c7f92a399160147c4ca74 (patch) | |
tree | a351164d82573652b5c803f8ed74a982857bfce2 /rts/RetainerProfile.c | |
parent | 1db0f4a48e9db5e85782e32f074cc83bbc145cb7 (diff) | |
download | haskell-6252292d4f4061f6e55c7f92a399160147c4ca74.tar.gz |
rts/RetainerProfile: Adding missing closure types to isRetainer
orzo in `#ghc` reported seeing a crash due to the retainer profiler encountering
a BLOCKING_QUEUE closure, which isRetainer didn't know about. I performed an
audit to make sure that all of the valid closure types were listed; they
weren't. This is my guess of how they should appear.
Test Plan: Validate
Reviewers: simonmar, austin, erikd
Reviewed By: simonmar
Subscribers: rwbarton, thomie
GHC Trac Issues: #14235
Differential Revision: https://phabricator.haskell.org/D3967
Diffstat (limited to 'rts/RetainerProfile.c')
-rw-r--r-- | rts/RetainerProfile.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/rts/RetainerProfile.c b/rts/RetainerProfile.c index 1d5e9230c9..7a9b9ccd54 100644 --- a/rts/RetainerProfile.c +++ b/rts/RetainerProfile.c @@ -33,6 +33,18 @@ #include "Stable.h" /* markStableTables */ #include "sm/Storage.h" // for END_OF_STATIC_LIST +/* Note [What is a retainer?] + ~~~~~~~~~~~~~~~~~~~~~~~~~~ +The definition of what sorts of things are counted as retainers is a bit hard to +pin down. Intuitively, we want to identify closures which will help the user +identify memory leaks due to thunks. In practice we also end up lumping mutable +objects in this group for reasons that have been lost to time. + +The definition of retainer is implemented in isRetainer(), defined later in this +file. +*/ + + /* Note: what to change in order to plug-in a new retainer profiling scheme? (1) type retainer in ../includes/StgRetainerProf.h @@ -1022,6 +1034,9 @@ isRetainer( StgClosure *c ) case MUT_VAR_DIRTY: case MUT_ARR_PTRS_CLEAN: case MUT_ARR_PTRS_DIRTY: + case SMALL_MUT_ARR_PTRS_CLEAN: + case SMALL_MUT_ARR_PTRS_DIRTY: + case BLOCKING_QUEUE: // thunks are retainers. case THUNK: @@ -1069,17 +1084,21 @@ isRetainer( StgClosure *c ) // closures. See trac #3956 for a program that hit this error. case IND_STATIC: case BLACKHOLE: + case WHITEHOLE: // static objects case FUN_STATIC: // misc case PRIM: case BCO: case ARR_WORDS: + case COMPACT_NFDATA: // STM case TREC_CHUNK: // immutable arrays case MUT_ARR_PTRS_FROZEN: case MUT_ARR_PTRS_FROZEN0: + case SMALL_MUT_ARR_PTRS_FROZEN: + case SMALL_MUT_ARR_PTRS_FROZEN0: return false; // @@ -1089,11 +1108,15 @@ isRetainer( StgClosure *c ) // legal objects during retainer profiling. case UPDATE_FRAME: case CATCH_FRAME: + case CATCH_RETRY_FRAME: + case CATCH_STM_FRAME: case UNDERFLOW_FRAME: + case ATOMICALLY_FRAME: case STOP_FRAME: case RET_BCO: case RET_SMALL: case RET_BIG: + case RET_FUN: // other cases case IND: case INVALID_OBJECT: |