From: simonm Date: Fri, 26 Feb 1999 12:43:58 +0000 (+0000) Subject: [project @ 1999-02-26 12:43:58 by simonm] X-Git-Tag: Approximately_9120_patches~6507 X-Git-Url: http://git.megacz.com/?a=commitdiff_plain;h=284ed5fbb31808846b2ff66f4c44b5d1e9901d46;p=ghc-hetmet.git [project @ 1999-02-26 12:43:58 by simonm] Fix bug in finalizeWeakPointersNow - some weak ptrs could be missed. --- diff --git a/ghc/rts/Weak.c b/ghc/rts/Weak.c index 854fcf9..23c09b9 100644 --- a/ghc/rts/Weak.c +++ b/ghc/rts/Weak.c @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: Weak.c,v 1.8 1999/02/11 14:22:55 simonm Exp $ + * $Id: Weak.c,v 1.9 1999/02/26 12:43:58 simonm Exp $ * * (c) The GHC Team, 1998-1999 * @@ -19,14 +19,19 @@ StgWeak *weak_ptr_list; * finalizeWeakPointersNow() is called just before the system is shut * down. It runs the finalizer for each weak pointer still in the * system. + * + * Careful here - rts_evalIO might cause a garbage collection, which + * might change weak_ptr_list. Must re-load weak_ptr_list each time + * around the loop. */ void finalizeWeakPointersNow(void) { StgWeak *w; - - for (w = weak_ptr_list; w; w = w->link) { + + while ((w = weak_ptr_list)) { + weak_ptr_list = w->link; IF_DEBUG(weak,fprintf(stderr,"Finalising weak pointer at %p -> %p\n", w, w->key)); w->header.info = &DEAD_WEAK_info; if (w->finalizer != &NO_FINALIZER_closure) {