X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2Fsm%2FCompact.c;h=5f56c1e84b61a8622482ba73d8f574dc43465408;hb=f8f4cb3f3a46e0495917a927cefe906531b7b38e;hp=53eb2fbb86e90473ff9432f3d938434f01eb40ba;hpb=6494b3cb78498363a2578a62d6cbbf3f55793e2a;p=ghc-hetmet.git diff --git a/rts/sm/Compact.c b/rts/sm/Compact.c index 53eb2fb..5f56c1e 100644 --- a/rts/sm/Compact.c +++ b/rts/sm/Compact.c @@ -1,6 +1,6 @@ /* ----------------------------------------------------------------------------- * - * (c) The GHC Team 2001-2006 + * (c) The GHC Team 2001-2008 * * Compacting garbage collector * @@ -83,11 +83,8 @@ thread (StgClosure **p) if (HEAP_ALLOCED(q)) { bd = Bdescr(q); - // a handy way to discover whether the ptr is into the - // compacted area of the old gen, is that the EVACUATED flag - // is zero (it's non-zero for all the other areas of live - // memory). - if ((bd->flags & BF_EVACUATED) == 0) + + if (bd->flags & BF_MARKED) { iptr = *q; switch (GET_CLOSURE_TAG((StgClosure *)iptr)) @@ -109,6 +106,12 @@ thread (StgClosure **p) } } +static void +thread_root (void *user STG_UNUSED, StgClosure **p) +{ + thread(p); +} + // This version of thread() takes a (void *), used to circumvent // warnings from gcc about pointer punning and strict aliasing. STATIC_INLINE void thread_ (void *p) { thread((StgClosure **)p); } @@ -461,7 +464,7 @@ thread_AP_STACK (StgAP_STACK *ap) static StgPtr thread_TSO (StgTSO *tso) { - thread_(&tso->link); + thread_(&tso->_link); thread_(&tso->global_link); if ( tso->why_blocked == BlockedOnMVar @@ -487,6 +490,10 @@ update_fwd_large( bdescr *bd ) for (; bd != NULL; bd = bd->link) { + // nothing to do in a pinned block; it might not even have an object + // at the beginning. + if (bd->flags & BF_PINNED) continue; + p = bd->start; info = get_itbl((StgClosure *)p); @@ -618,8 +625,6 @@ thread_obj (StgInfoTable *info, StgPtr p) case MUT_VAR_CLEAN: case MUT_VAR_DIRTY: case CAF_BLACKHOLE: - case SE_CAF_BLACKHOLE: - case SE_BLACKHOLE: case BLACKHOLE: { StgPtr end; @@ -644,7 +649,8 @@ thread_obj (StgInfoTable *info, StgPtr p) return p + sizeofW(StgWeak); } - case MVAR: + case MVAR_CLEAN: + case MVAR_DIRTY: { StgMVar *mvar = (StgMVar *)p; thread_(&mvar->head); @@ -954,13 +960,13 @@ update_bkwd_compact( step *stp ) } void -compact(void) +compact(StgClosure *static_objects) { nat g, s, blocks; step *stp; // 1. thread the roots - GetRoots((evac_fn)thread); + markCapabilities((evac_fn)thread_root, NULL); // the weak pointer lists... if (weak_ptr_list != NULL) { @@ -974,19 +980,33 @@ compact(void) for (g = 1; g < RtsFlags.GcFlags.generations; g++) { bdescr *bd; StgPtr p; + nat n; for (bd = generations[g].mut_list; bd != NULL; bd = bd->link) { for (p = bd->start; p < bd->free; p++) { thread((StgClosure **)p); } } + for (n = 0; n < n_capabilities; n++) { + for (bd = capabilities[n].mut_lists[g]; + bd != NULL; bd = bd->link) { + for (p = bd->start; p < bd->free; p++) { + thread((StgClosure **)p); + } + } + } } // the global thread list - thread((void *)&all_threads); + for (s = 0; s < total_steps; s++) { + thread((void *)&all_steps[s].threads); + } // any threads resurrected during this GC thread((void *)&resurrected_threads); + // the blackhole queue + thread((void *)&blackhole_queue); + // the task list { Task *task; @@ -998,13 +1018,13 @@ compact(void) } // the static objects - thread_static(scavenged_static_objects); + thread_static(static_objects /* ToDo: ok? */); // the stable pointer table - threadStablePtrTable((evac_fn)thread); + threadStablePtrTable((evac_fn)thread_root, NULL); // the CAF list (used by GHCi) - markCAFs((evac_fn)thread); + markCAFs((evac_fn)thread_root, NULL); // 2. update forward ptrs for (g = 0; g < RtsFlags.GcFlags.generations; g++) {