From: simonmar Date: Thu, 20 Feb 2003 15:39:59 +0000 (+0000) Subject: [project @ 2003-02-20 15:39:59 by simonmar] X-Git-Tag: Approx_11550_changesets_converted~1128 X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=commitdiff_plain;h=51a1c2a2de6d85ae990a405408040be56b0c50a9 [project @ 2003-02-20 15:39:59 by simonmar] closureSatisfiesConstraints: check whether the retainer set is valid before attempting to match it against a constraint. It might not be valid if the object is an ex-weak-pointer which was finalized after the last GC. MERGE TO STABLE --- diff --git a/ghc/rts/ProfHeap.c b/ghc/rts/ProfHeap.c index 963fdef..51fa3df 100644 --- a/ghc/rts/ProfHeap.c +++ b/ghc/rts/ProfHeap.c @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: ProfHeap.c,v 1.42 2003/01/23 16:39:30 simonmar Exp $ + * $Id: ProfHeap.c,v 1.43 2003/02/20 15:39:59 simonmar Exp $ * * (c) The GHC Team, 1998-2000 * @@ -593,12 +593,18 @@ closureSatisfiesConstraints( StgClosure* p ) if (RtsFlags.ProfFlags.retainerSelector) { RetainerSet *rs; nat i; - rs = retainerSetOf((StgClosure *)p); - if (rs != NULL) { - for (i = 0; i < rs->num; i++) { - b = strMatchesSelector( rs->element[i]->cc->label, - RtsFlags.ProfFlags.retainerSelector ); - if (b) return rtsTrue; + // We must check that the retainer set is valid here. One + // reason it might not be valid is if this closure is a + // a newly deceased weak pointer (i.e. a DEAD_WEAK), since + // these aren't reached by the retainer profiler's traversal. + if (isRetainerSetFieldValid((StgClosure *)p)) { + rs = retainerSetOf((StgClosure *)p); + if (rs != NULL) { + for (i = 0; i < rs->num; i++) { + b = strMatchesSelector( rs->element[i]->cc->label, + RtsFlags.ProfFlags.retainerSelector ); + if (b) return rtsTrue; + } } } return rtsFalse;