The following patch should fix 4.02's GC bug. I'll put up fixed
distributions as soon as possible.
diff -c -c -r1.30 GC.c
*** GC.c 1999/02/11 17:40:26 1.30
--- GC.c 1999/02/15 14:21:50
***************
*** 1932,1941 ****
scavenge_mutable_list(generation *gen)
{
StgInfoTable *info;
! StgMutClosure *p, *next, *new_list;
p = gen->saved_mut_list;
- new_list = gen->mut_list;
next = p->mut_link;
evac_gen = 0;
--- 1932,1940 ----
scavenge_mutable_list(generation *gen)
{
StgInfoTable *info;
! StgMutClosure *p, *next;
p = gen->saved_mut_list;
next = p->mut_link;
evac_gen = 0;
***************
*** 1966,1981 ****
if (failed_to_evac) {
failed_to_evac = rtsFalse;
! p->mut_link = new_list;
! new_list = p;
}
continue;
}
case MUT_ARR_PTRS:
/* follow everything */
! p->mut_link = new_list;
! new_list = p;
{
StgPtr end, q;
--- 1965,1980 ----
if (failed_to_evac) {
failed_to_evac = rtsFalse;
! p->mut_link = gen->mut_list;
! gen->mut_list = p;
}
continue;
}
case MUT_ARR_PTRS:
/* follow everything */
! p->mut_link = gen->mut_list;
! gen->mut_list = p;
{
StgPtr end, q;
***************
*** 1993,2000 ****
*/
ASSERT(p->header.info != &MUT_CONS_info);
((StgMutVar *)p)->var = evacuate(((StgMutVar *)p)->var);
! p->mut_link = new_list;
! new_list = p;
continue;
case MVAR:
--- 1992,1999 ----
*/
ASSERT(p->header.info != &MUT_CONS_info);
((StgMutVar *)p)->var = evacuate(((StgMutVar *)p)->var);
! p->mut_link = gen->mut_list;
! gen->mut_list = p;
continue;
case MVAR:
***************
*** 2003,2010 ****
(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;
continue;
}
--- 2002,2009 ----
(StgClosure *)mvar->head = evacuate((StgClosure *)mvar->head);
(StgClosure *)mvar->tail = evacuate((StgClosure *)mvar->tail);
(StgClosure *)mvar->value = evacuate((StgClosure *)mvar->value);
! p->mut_link = gen->mut_list;
! gen->mut_list = p;
continue;
}
***************
*** 2027,2034 ****
* point to some younger objects (because we set evac_gen to 0
* above).
*/
! tso->mut_link = new_list;
! new_list = (StgMutClosure *)tso;
continue;
}
--- 2026,2033 ----
* point to some younger objects (because we set evac_gen to 0
* above).
*/
! tso->mut_link = gen->mut_list;
! gen->mut_list = (StgMutClosure *)tso;
continue;
}
***************
*** 2037,2044 ****
StgBlockingQueue *bh = (StgBlockingQueue *)p;
(StgClosure *)bh->blocking_queue =
evacuate((StgClosure *)bh->blocking_queue);
! p->mut_link = new_list;
! new_list = p;
continue;
}
--- 2036,2043 ----
StgBlockingQueue *bh = (StgBlockingQueue *)p;
(StgClosure *)bh->blocking_queue =
evacuate((StgClosure *)bh->blocking_queue);
! p->mut_link = gen->mut_list;
! gen->mut_list = p;
continue;
}
***************
*** 2047,2054 ****
barf("scavenge_mut_list: strange object?");
}
}
-
- gen->mut_list = new_list;
}
static void
--- 2046,2051 ----