X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FRetainerProfile.h;h=827daa8ef468c779ac25441dc8610d3100146937;hb=2d4b82a0a94edeaedd9d0c4b3f023ac8d1d59766;hp=7a2f0fb16e8d6c9de3bbef3a0449cedc1c004b7e;hpb=db61851c5472bf565cd1da900b33d6e033fd743d;p=ghc-hetmet.git diff --git a/ghc/rts/RetainerProfile.h b/ghc/rts/RetainerProfile.h index 7a2f0fb..827daa8 100644 --- a/ghc/rts/RetainerProfile.h +++ b/ghc/rts/RetainerProfile.h @@ -1,5 +1,4 @@ /* ----------------------------------------------------------------------------- - * $Id: RetainerProfile.h,v 1.1 2001/11/22 14:25:12 simonmar Exp $ * * (c) The GHC Team, 2001 * Author: Sungwoo Park @@ -13,15 +12,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 */