diff --git a/includes/rts/storage/ClosureTypes.h b/includes/rts/storage/ClosureTypes.h index 68cc9192572ac95a6c3732b167cf963899bd200e..240982ca8560ae508c488c901dfbc7f525d7dc67 100644 --- a/includes/rts/storage/ClosureTypes.h +++ b/includes/rts/storage/ClosureTypes.h @@ -1,5 +1,5 @@ /* ---------------------------------------------------------------------------- - * + * * (c) The GHC Team, 1998-2005 * * Closure Type Constants: out here because the native code generator @@ -9,11 +9,12 @@ #pragma once -/* +/* * WARNING WARNING WARNING * - * If you add or delete any closure types, don't forget to update - * the closure flags table in rts/ClosureFlags.c. + * If you add or delete any closure types, don't forget to update the following, + * - the closure flags table in rts/ClosureFlags.c + * - isRetainer in rts/RetainerProfile.c */ /* Object tag 0 raises an internal error */ diff --git a/rts/RetainerProfile.c b/rts/RetainerProfile.c index 1d5e9230c9882de27b4a691c97c78355540e1034..7a9b9ccd54271dbace2783d25c6e2546ca0e3561 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: