From 8f05bdd555df8284dc6d0ec4d64d42f7aebc676b Mon Sep 17 00:00:00 2001 From: sewardj Date: Wed, 17 Mar 1999 16:28:34 +0000 Subject: [PATCH] [project @ 1999-03-17 16:28:34 by sewardj] Make mut_link field be NULL when removing CAF_{UN}ENTERED from mut_once_list. Convention is to have the field be NULL iff the caf is not on a mut_once_list. This gives a O(1) cost way to avoid putting a caf onto a mut_once_list more than once. --- ghc/rts/GC.c | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/ghc/rts/GC.c b/ghc/rts/GC.c index 8619be2..8116700 100644 --- a/ghc/rts/GC.c +++ b/ghc/rts/GC.c @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: GC.c,v 1.53 1999/03/16 13:20:13 simonm Exp $ + * $Id: GC.c,v 1.54 1999/03/17 16:28:34 sewardj Exp $ * * (c) The GHC Team 1998-1999 * @@ -1656,7 +1656,6 @@ scavenge(step *step) case STABLE_NAME: case IND_PERM: case IND_OLDGEN_PERM: - case CAF_UNENTERED: { StgPtr end; @@ -1668,6 +1667,21 @@ scavenge(step *step) break; } + case CAF_UNENTERED: + { + StgCAF *caf = (StgCAF *)p; + + caf->body = evacuate(caf->body); + if (failed_to_evac) { + failed_to_evac = rtsFalse; + recordOldToNewPtrs((StgMutClosure *)p); + } else { + caf->mut_link = NULL; + } + p += sizeofW(StgCAF); + break; + } + case CAF_ENTERED: { StgCAF *caf = (StgCAF *)p; @@ -1677,6 +1691,8 @@ scavenge(step *step) if (failed_to_evac) { failed_to_evac = rtsFalse; recordOldToNewPtrs((StgMutClosure *)p); + } else { + caf->mut_link = NULL; } p += sizeofW(StgCAF); break; @@ -2040,6 +2056,8 @@ scavenge_mut_once_list(generation *gen) failed_to_evac = rtsFalse; p->mut_link = new_list; new_list = p; + } else { + p->mut_link = NULL; } } continue; @@ -2052,7 +2070,9 @@ scavenge_mut_once_list(generation *gen) failed_to_evac = rtsFalse; p->mut_link = new_list; new_list = p; - } + } else { + p->mut_link = NULL; + } } continue; -- 1.7.10.4