}
};
-void factor_vm::collect_full_compact(bool trace_contexts_p)
+void factor_vm::collect_compact_impl(bool trace_contexts_p)
{
tenured_space *tenured = data->tenured;
mark_bits<object> *data_forwarding_map = &tenured->state;
}
};
-void factor_vm::collect_full_mark(bool trace_contexts_p)
+void factor_vm::collect_mark_impl(bool trace_contexts_p)
{
full_collector collector(this);
code->clear_remembered_set();
}
-void factor_vm::collect_full_sweep()
+void factor_vm::collect_sweep_impl()
{
data->tenured->starts.clear_object_start_offsets();
object_start_map_updater updater(&data->tenured->starts);
data->tenured->sweep(updater);
}
-void factor_vm::collect_growing_heap(cell requested_bytes,
- bool trace_contexts_p,
- bool compact_p)
+void factor_vm::collect_growing_heap(cell requested_bytes, bool trace_contexts_p)
{
/* Grow the data heap and copy all live objects to the new heap. */
data_heap *old = data;
set_data_heap(data->grow(requested_bytes));
- collect_full_mark(trace_contexts_p);
+ collect_mark_impl(trace_contexts_p);
+ collect_compact_impl(trace_contexts_p);
delete old;
-
- if(compact_p)
- collect_full_compact(trace_contexts_p);
- else
- {
- collect_full_sweep();
- relocate_code_heap();
- }
-}
-
-void factor_vm::collect_full(bool trace_contexts_p, bool compact_p)
-{
- collect_full_mark(trace_contexts_p);
-
- if(compact_p)
- collect_full_compact(trace_contexts_p);
- else
- {
- collect_full_sweep();
- update_code_heap_words_and_literals();
- }
}
}
stats->max_gc_time = gc_elapsed;
}
-void factor_vm::gc(gc_op op,
- cell requested_bytes,
- bool trace_contexts_p,
- bool compact_p)
+void factor_vm::gc(gc_op op, cell requested_bytes, bool trace_contexts_p)
{
assert(!gc_off);
assert(!current_gc);
current_gc->op = collect_full_op;
break;
case collect_full_op:
+ case collect_compact_op:
current_gc->op = collect_growing_heap_op;
break;
default:
record_gc_stats(&gc_stats.aging_stats);
break;
case collect_full_op:
- collect_full(trace_contexts_p,compact_p);
+ collect_mark_impl(trace_contexts_p);
+ collect_sweep_impl();
+ update_code_heap_words_and_literals();
+ record_gc_stats(&gc_stats.full_stats);
+ break;
+ case collect_compact_op:
+ collect_mark_impl(trace_contexts_p);
+ collect_compact_impl(trace_contexts_p);
record_gc_stats(&gc_stats.full_stats);
break;
case collect_growing_heap_op:
- collect_growing_heap(requested_bytes,trace_contexts_p,compact_p);
+ collect_growing_heap(requested_bytes,trace_contexts_p);
record_gc_stats(&gc_stats.full_stats);
break;
default:
{
gc(collect_nursery_op,
0, /* requested size */
- true, /* trace contexts? */
- false /* compact code heap? */);
+ true /* trace contexts? */);
}
void factor_vm::primitive_full_gc()
{
gc(collect_full_op,
0, /* requested size */
- true, /* trace contexts? */
- true /* compact code heap? */);
+ true /* trace contexts? */);
}
void factor_vm::primitive_compact_gc()
{
- gc(collect_full_op,
+ gc(collect_compact_op,
0, /* requested size */
- true, /* trace contexts? */
- true /* compact code heap? */);
+ true /* trace contexts? */);
}
void factor_vm::add_gc_stats(generation_statistics *stats, growable_array *result)
{
gc(collect_growing_heap_op,
size, /* requested size */
- true, /* trace contexts? */
- false /* compact code heap? */);
+ true /* trace contexts? */);
}
}
collect_aging_op,
collect_to_tenured_op,
collect_full_op,
+ collect_compact_op,
collect_growing_heap_op
};
for(cell i = 0; i < special_object_count; i++)
if(!save_env_p(i)) special_objects[i] = false_object;
- gc(collect_full_op,
+ gc(collect_compact_op,
0, /* requested size */
- false, /* discard objects only reachable from stacks */
- true /* compact the code heap */);
+ false /* discard objects only reachable from stacks */);
/* Save the image */
if(save_image((vm_char *)(path.untagged() + 1)))
void collect_nursery();
void collect_aging();
void collect_to_tenured();
- void collect_full_mark(bool trace_contexts_p);
- void collect_full_sweep();
- void collect_full_compact(bool trace_contexts_p);
- void collect_growing_heap(cell requested_bytes, bool trace_contexts_p, bool compact_p);
- void collect_full(bool trace_contexts_p, bool compact_p);
+ void collect_mark_impl(bool trace_contexts_p);
+ void collect_sweep_impl();
+ void collect_compact_impl(bool trace_contexts_p);
+ void collect_growing_heap(cell requested_bytes, bool trace_contexts_p);
void record_gc_stats(generation_statistics *stats);
- void gc(gc_op op, cell requested_bytes, bool trace_contexts_p, bool compact_p);
+ void gc(gc_op op, cell requested_bytes, bool trace_contexts_p);
void primitive_minor_gc();
void primitive_full_gc();
void primitive_compact_gc();