case CONSTR_0_1:
case FUN_1_0:
case CONSTR_1_0:
- return sizeofW(StgHeader) + 1;
case THUNK_0_1:
+ case THUNK_1_0:
+ return sizeofW(StgHeader) + 1;
case THUNK_0_2:
case FUN_0_2:
case CONSTR_0_2:
- case THUNK_1_0:
case THUNK_1_1:
case FUN_1_1:
case CONSTR_1_1:
case THUNK_2_0:
case FUN_2_0:
case CONSTR_2_0:
- return sizeofW(StgHeader) + 2; // MIN_UPD_SIZE
+ return sizeofW(StgHeader) + 2;
case THUNK_SELECTOR:
return THUNK_SELECTOR_sizeW();
case AP_STACK:
return arr_words_sizeW((StgArrWords *)p);
case MUT_ARR_PTRS:
case MUT_ARR_PTRS_FROZEN:
+ case MUT_ARR_PTRS_FROZEN0:
return mut_arr_ptrs_sizeW((StgMutArrPtrs*)p);
case TSO:
return tso_sizeW((StgTSO *)p);
case MUT_ARR_PTRS:
case MUT_ARR_PTRS_FROZEN:
+ case MUT_ARR_PTRS_FROZEN0:
// follow everything
{
StgPtr next;
switch (info->type) {
case FUN_0_1:
case CONSTR_0_1:
+ case THUNK_0_1:
return p + sizeofW(StgHeader) + 1;
case FUN_1_0:
case THUNK_1_0:
thread((StgPtr)&((StgClosure *)p)->payload[0]);
- return p + sizeofW(StgHeader) + 2; // MIN_UPD_SIZE
+ return p + sizeofW(StgHeader) + 1;
- case THUNK_0_1: // MIN_UPD_SIZE
case THUNK_0_2:
case FUN_0_2:
case CONSTR_0_2:
case STABLE_NAME:
case IND_PERM:
case MUT_VAR:
- case MUT_CONS:
case CAF_BLACKHOLE:
case SE_CAF_BLACKHOLE:
case SE_BLACKHOLE:
case IND_OLDGEN:
case IND_OLDGEN_PERM:
- thread((StgPtr)&((StgIndOldGen *)p)->indirectee);
- return p + sizeofW(StgIndOldGen);
+ thread((StgPtr)&((StgInd *)p)->indirectee);
+ return p + sizeofW(StgInd);
case THUNK_SELECTOR:
{
case MUT_ARR_PTRS:
case MUT_ARR_PTRS_FROZEN:
+ case MUT_ARR_PTRS_FROZEN0:
// follow everything
{
StgPtr next;
// Rebuild the mutable list for the old generation.
if (ip_MUTABLE(info)) {
- recordMutable((StgMutClosure *)free);
+ recordMutable((StgClosure *)free);
}
// relocate TSOs
return free_blocks;
}
-static void
-thread_mut_once_list( generation *g )
-{
- StgMutClosure *p, *next;
-
- for (p = g->mut_once_list; p != END_MUT_LIST; p = next) {
- next = p->mut_link;
- thread((StgPtr)&p->mut_link);
- }
-
- thread((StgPtr)&g->mut_once_list);
-}
-
void
compact( void (*get_roots)(evac_fn) )
{
// mutable lists
for (g = 1; g < RtsFlags.GcFlags.generations; g++) {
- thread((StgPtr)&generations[g].mut_list);
- thread_mut_once_list(&generations[g]);
+ bdescr *bd;
+ StgPtr p;
+ for (bd = generations[g].mut_list; bd != NULL; bd = bd->link) {
+ for (p = bd->start; p < bd->free; p++) {
+ thread(p);
+ }
+ }
}
// the global thread list