case MUT_ARR_PTRS_FROZEN0:
// follow everything
{
- StgPtr next;
+ StgMutArrPtrs *a;
- next = p + mut_arr_ptrs_sizeW((StgMutArrPtrs*)p);
- for (p = (P_)((StgMutArrPtrs *)p)->payload; p < next; p++) {
- thread((StgClosure **)p);
- }
- continue;
+ a = (StgMutArrPtrs*)p;
+ for (p = (P_)a->payload; p < (P_)&a->payload[a->ptrs]; p++) {
+ thread((StgClosure **)p);
+ }
+ continue;
}
case TSO:
case MUT_ARR_PTRS_FROZEN0:
// follow everything
{
- StgPtr next;
-
- next = p + mut_arr_ptrs_sizeW((StgMutArrPtrs*)p);
- for (p = (P_)((StgMutArrPtrs *)p)->payload; p < next; p++) {
+ StgMutArrPtrs *a;
+
+ a = (StgMutArrPtrs *)p;
+ for (p = (P_)a->payload; p < (P_)&a->payload[a->ptrs]; p++) {
thread((StgClosure **)p);
}
- return p;
+
+ return (StgPtr)a + mut_arr_ptrs_sizeW(a);
}
case TSO:
}
static nat
-update_bkwd_compact( step *stp )
+update_bkwd_compact( generation *gen )
{
StgPtr p, free;
#if 0
nat size, free_blocks;
StgWord iptr;
- bd = free_bd = stp->old_blocks;
+ bd = free_bd = gen->old_blocks;
free = free_bd->start;
free_blocks = 1;
void
compact(StgClosure *static_objects)
{
- nat g, s, blocks;
- step *stp;
+ nat g, blocks;
+ generation *gen;
// 1. thread the roots
markCapabilities((evac_fn)thread_root, NULL);
}
// the global thread list
- for (s = 0; s < total_steps; s++) {
- thread((void *)&all_steps[s].threads);
+ for (g = 0; g < RtsFlags.GcFlags.generations; g++) {
+ thread((void *)&generations[g].threads);
}
// any threads resurrected during this GC
// the task list
{
Task *task;
+ InCall *incall;
for (task = all_tasks; task != NULL; task = task->all_link) {
- if (task->tso) {
- thread_(&task->tso);
- }
+ for (incall = task->incall; incall != NULL;
+ incall = incall->prev_stack) {
+ if (incall->tso) {
+ thread_(&incall->tso);
+ }
+ }
}
}
// 2. update forward ptrs
for (g = 0; g < RtsFlags.GcFlags.generations; g++) {
- for (s = 0; s < generations[g].n_steps; s++) {
- if (g==0 && s ==0) continue;
- stp = &generations[g].steps[s];
- debugTrace(DEBUG_gc, "update_fwd: %d.%d",
- stp->gen->no, stp->no);
-
- update_fwd(stp->blocks);
- update_fwd_large(stp->scavenged_large_objects);
- if (g == RtsFlags.GcFlags.generations-1 && stp->old_blocks != NULL) {
- debugTrace(DEBUG_gc, "update_fwd: %d.%d (compact)",
- stp->gen->no, stp->no);
- update_fwd_compact(stp->old_blocks);
- }
+ gen = &generations[g];
+ debugTrace(DEBUG_gc, "update_fwd: %d", g);
+
+ update_fwd(gen->blocks);
+ update_fwd_large(gen->scavenged_large_objects);
+ if (g == RtsFlags.GcFlags.generations-1 && gen->old_blocks != NULL) {
+ debugTrace(DEBUG_gc, "update_fwd: %d (compact)", g);
+ update_fwd_compact(gen->old_blocks);
}
}
// 3. update backward ptrs
- stp = &oldest_gen->steps[0];
- if (stp->old_blocks != NULL) {
- blocks = update_bkwd_compact(stp);
+ gen = oldest_gen;
+ if (gen->old_blocks != NULL) {
+ blocks = update_bkwd_compact(gen);
debugTrace(DEBUG_gc,
- "update_bkwd: %d.%d (compact, old: %d blocks, now %d blocks)",
- stp->gen->no, stp->no,
- stp->n_old_blocks, blocks);
- stp->n_old_blocks = blocks;
+ "update_bkwd: %d (compact, old: %d blocks, now %d blocks)",
+ gen->no, gen->n_old_blocks, blocks);
+ gen->n_old_blocks = blocks;
}
}