X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FRetainerProfile.h;h=5eec192bbaec52ae76ae58cccc41eec46ddda1a9;hb=6a5ea4c513a58d733e8b109943dbf07038e08b02;hp=7a2f0fb16e8d6c9de3bbef3a0449cedc1c004b7e;hpb=db61851c5472bf565cd1da900b33d6e033fd743d;p=ghc-hetmet.git diff --git a/ghc/rts/RetainerProfile.h b/ghc/rts/RetainerProfile.h index 7a2f0fb..5eec192 100644 --- a/ghc/rts/RetainerProfile.h +++ b/ghc/rts/RetainerProfile.h @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: RetainerProfile.h,v 1.1 2001/11/22 14:25:12 simonmar Exp $ + * $Id: RetainerProfile.h,v 1.4 2004/08/13 13:10:29 simonmar Exp $ * * (c) The GHC Team, 2001 * Author: Sungwoo Park @@ -13,15 +13,34 @@ #ifdef PROFILING +#include "RetainerSet.h" + extern void initRetainerProfiling ( void ); extern void endRetainerProfiling ( void ); extern void printRetainer ( FILE *, retainer ); extern void retainerProfile ( void ); extern void resetStaticObjectForRetainerProfiling ( void ); -// firstStack is exported because memInventory() in Schedule.c uses it. +extern StgWord RTS_VAR(flip); + +// extract the retainer set field from c +#define RSET(c) ((c)->header.prof.hp.rs) + +#define isRetainerSetFieldValid(c) \ + ((((StgWord)(c)->header.prof.hp.rs & 1) ^ flip) == 0) + +static inline RetainerSet * +retainerSetOf( StgClosure *c ) +{ + ASSERT( isRetainerSetFieldValid(c) ); + // StgWord has the same size as pointers, so the following type + // casting is okay. + return (RetainerSet *)((StgWord)RSET(c) ^ flip); +} + +// Used by Storage.c:memInventory() #ifdef DEBUG -extern bdescr *firstStack; +extern lnat retainerStackBlocks ( void ); #endif #endif /* PROFILING */