From 0a7a9665973188f0c4f169ae30e0c9302564c870 Mon Sep 17 00:00:00 2001 From: simonm Date: Mon, 15 Feb 1999 14:27:19 +0000 Subject: [PATCH] [project @ 1999-02-15 14:27:19 by simonm] Fix another bug in scavenge_mutable_list: mutable objects promoted during scavenging of the mutable list itself could get dropped. --- ghc/rts/GC.c | 31 ++++++++++++++----------------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/ghc/rts/GC.c b/ghc/rts/GC.c index 82860ce..67964e5 100644 --- a/ghc/rts/GC.c +++ b/ghc/rts/GC.c @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: GC.c,v 1.30 1999/02/11 17:40:26 simonm Exp $ + * $Id: GC.c,v 1.31 1999/02/15 14:27:19 simonm Exp $ * * (c) The GHC Team 1998-1999 * @@ -1932,10 +1932,9 @@ static void scavenge_mutable_list(generation *gen) { StgInfoTable *info; - StgMutClosure *p, *next, *new_list; + StgMutClosure *p, *next; p = gen->saved_mut_list; - new_list = gen->mut_list; next = p->mut_link; evac_gen = 0; @@ -1966,16 +1965,16 @@ scavenge_mutable_list(generation *gen) if (failed_to_evac) { failed_to_evac = rtsFalse; - p->mut_link = new_list; - new_list = p; + p->mut_link = gen->mut_list; + gen->mut_list = p; } continue; } case MUT_ARR_PTRS: /* follow everything */ - p->mut_link = new_list; - new_list = p; + p->mut_link = gen->mut_list; + gen->mut_list = p; { StgPtr end, q; @@ -1993,8 +1992,8 @@ scavenge_mutable_list(generation *gen) */ ASSERT(p->header.info != &MUT_CONS_info); ((StgMutVar *)p)->var = evacuate(((StgMutVar *)p)->var); - p->mut_link = new_list; - new_list = p; + p->mut_link = gen->mut_list; + gen->mut_list = p; continue; case MVAR: @@ -2003,8 +2002,8 @@ scavenge_mutable_list(generation *gen) (StgClosure *)mvar->head = evacuate((StgClosure *)mvar->head); (StgClosure *)mvar->tail = evacuate((StgClosure *)mvar->tail); (StgClosure *)mvar->value = evacuate((StgClosure *)mvar->value); - p->mut_link = new_list; - new_list = p; + p->mut_link = gen->mut_list; + gen->mut_list = p; continue; } @@ -2027,8 +2026,8 @@ scavenge_mutable_list(generation *gen) * point to some younger objects (because we set evac_gen to 0 * above). */ - tso->mut_link = new_list; - new_list = (StgMutClosure *)tso; + tso->mut_link = gen->mut_list; + gen->mut_list = (StgMutClosure *)tso; continue; } @@ -2037,8 +2036,8 @@ scavenge_mutable_list(generation *gen) StgBlockingQueue *bh = (StgBlockingQueue *)p; (StgClosure *)bh->blocking_queue = evacuate((StgClosure *)bh->blocking_queue); - p->mut_link = new_list; - new_list = p; + p->mut_link = gen->mut_list; + gen->mut_list = p; continue; } @@ -2047,8 +2046,6 @@ scavenge_mutable_list(generation *gen) barf("scavenge_mut_list: strange object?"); } } - - gen->mut_list = new_list; } static void -- 1.7.10.4