X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2Fsm%2FCompact.c;h=5f56c1e84b61a8622482ba73d8f574dc43465408;hb=29fd0a47007971cd7def0d778faf3f5abb893d31;hp=9f0a69d1d1258f89654ed51b0c44a5943ec20c89;hpb=74ee9df9f9e79e7110e9d8541b84010f35c464c5;p=ghc-hetmet.git diff --git a/rts/sm/Compact.c b/rts/sm/Compact.c index 9f0a69d..5f56c1e 100644 --- a/rts/sm/Compact.c +++ b/rts/sm/Compact.c @@ -490,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); @@ -621,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; @@ -966,9 +968,6 @@ compact(StgClosure *static_objects) // 1. thread the roots markCapabilities((evac_fn)thread_root, NULL); - // spark queues - traverseSparkQueues((evac_fn)thread_root, NULL); - // the weak pointer lists... if (weak_ptr_list != NULL) { thread((void *)&weak_ptr_list); @@ -981,11 +980,20 @@ compact(StgClosure *static_objects) 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 @@ -996,6 +1004,9 @@ compact(StgClosure *static_objects) // any threads resurrected during this GC thread((void *)&resurrected_threads); + // the blackhole queue + thread((void *)&blackhole_queue); + // the task list { Task *task;