X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FGCCompact.c;h=30836e3414475337b8281a0e4e0335a16ba3a147;hb=abde5fdfcaa5f363d9cf8cf0a10aa281c40887fe;hp=45836db0599ed57adebbbcca9ef34adb87e5976d;hpb=b61f70ce5ff947642c96b1ad980351691bb1e07a;p=ghc-hetmet.git diff --git a/ghc/rts/GCCompact.c b/ghc/rts/GCCompact.c index 45836db..30836e3 100644 --- a/ghc/rts/GCCompact.c +++ b/ghc/rts/GCCompact.c @@ -113,19 +113,19 @@ obj_sizeW( StgClosure *p, StgInfoTable *info ) 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: @@ -137,6 +137,7 @@ obj_sizeW( StgClosure *p, StgInfoTable *info ) 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); @@ -461,6 +462,7 @@ update_fwd_large( bdescr *bd ) case MUT_ARR_PTRS: case MUT_ARR_PTRS_FROZEN: + case MUT_ARR_PTRS_FROZEN0: // follow everything { StgPtr next; @@ -496,6 +498,7 @@ thread_obj (StgInfoTable *info, StgPtr p) switch (info->type) { case FUN_0_1: case CONSTR_0_1: + case THUNK_0_1: return p + sizeofW(StgHeader) + 1; case FUN_1_0: @@ -505,9 +508,8 @@ thread_obj (StgInfoTable *info, StgPtr p) 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: @@ -542,7 +544,6 @@ thread_obj (StgInfoTable *info, StgPtr p) case STABLE_NAME: case IND_PERM: case MUT_VAR: - case MUT_CONS: case CAF_BLACKHOLE: case SE_CAF_BLACKHOLE: case SE_BLACKHOLE: @@ -582,8 +583,8 @@ thread_obj (StgInfoTable *info, StgPtr p) 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: { @@ -604,6 +605,7 @@ thread_obj (StgInfoTable *info, StgPtr p) case MUT_ARR_PTRS: case MUT_ARR_PTRS_FROZEN: + case MUT_ARR_PTRS_FROZEN0: // follow everything { StgPtr next; @@ -645,7 +647,7 @@ thread_obj (StgInfoTable *info, StgPtr p) case TREC_CHUNK: { - int i; + StgWord i; StgTRecChunk *tc = (StgTRecChunk *)p; TRecEntry *e = &(tc -> entries[0]); thread((StgPtr)&tc->prev_chunk); @@ -841,7 +843,7 @@ update_bkwd_compact( step *stp ) // Rebuild the mutable list for the old generation. if (ip_MUTABLE(info)) { - recordMutable((StgMutClosure *)free); + recordMutable((StgClosure *)free); } // relocate TSOs @@ -868,19 +870,6 @@ update_bkwd_compact( step *stp ) 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) ) { @@ -900,8 +889,13 @@ 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