vm: fix issue with unnecessary heap growth
parent
9ffb01a9bd
commit
e1c365e69a
|
@ -127,9 +127,8 @@ void *factor_vm::get_rel_symbol(array *literals, cell index)
|
||||||
}
|
}
|
||||||
case ARRAY_TYPE:
|
case ARRAY_TYPE:
|
||||||
{
|
{
|
||||||
cell i;
|
|
||||||
array *names = untag<array>(symbol);
|
array *names = untag<array>(symbol);
|
||||||
for(i = 0; i < array_capacity(names); i++)
|
for(cell i = 0; i < array_capacity(names); i++)
|
||||||
{
|
{
|
||||||
symbol_char *name = alien_offset(array_nth(names,i));
|
symbol_char *name = alien_offset(array_nth(names,i));
|
||||||
void *sym = ffi_dlsym(d,name);
|
void *sym = ffi_dlsym(d,name);
|
||||||
|
|
|
@ -98,6 +98,11 @@ void data_heap::reset_generation(tenured_space *gen)
|
||||||
clear_decks(gen);
|
clear_decks(gen);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool data_heap::low_memory_p()
|
||||||
|
{
|
||||||
|
return (tenured->free_space() <= nursery->size + aging->size);
|
||||||
|
}
|
||||||
|
|
||||||
void factor_vm::set_data_heap(data_heap *data_)
|
void factor_vm::set_data_heap(data_heap *data_)
|
||||||
{
|
{
|
||||||
data = data_;
|
data = data_;
|
||||||
|
|
|
@ -29,6 +29,7 @@ struct data_heap {
|
||||||
void reset_generation(nursery_space *gen);
|
void reset_generation(nursery_space *gen);
|
||||||
void reset_generation(aging_space *gen);
|
void reset_generation(aging_space *gen);
|
||||||
void reset_generation(tenured_space *gen);
|
void reset_generation(tenured_space *gen);
|
||||||
|
bool low_memory_p();
|
||||||
};
|
};
|
||||||
|
|
||||||
struct data_heap_room {
|
struct data_heap_room {
|
||||||
|
|
|
@ -118,6 +118,22 @@ void factor_vm::collect_sweep_impl()
|
||||||
current_gc->event->ended_data_sweep();
|
current_gc->event->ended_data_sweep();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void factor_vm::collect_full(bool trace_contexts_p)
|
||||||
|
{
|
||||||
|
collect_mark_impl(trace_contexts_p);
|
||||||
|
collect_sweep_impl();
|
||||||
|
if(data->tenured->largest_free_block() <= data->nursery->size + data->aging->size)
|
||||||
|
collect_compact_impl(trace_contexts_p);
|
||||||
|
else
|
||||||
|
update_code_heap_words_and_literals();
|
||||||
|
}
|
||||||
|
|
||||||
|
void factor_vm::collect_compact(bool trace_contexts_p)
|
||||||
|
{
|
||||||
|
collect_mark_impl(trace_contexts_p);
|
||||||
|
collect_compact_impl(trace_contexts_p);
|
||||||
|
}
|
||||||
|
|
||||||
void factor_vm::collect_growing_heap(cell requested_bytes, bool trace_contexts_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. */
|
/* Grow the data heap and copy all live objects to the new heap. */
|
||||||
|
|
28
vm/gc.cpp
28
vm/gc.cpp
|
@ -152,12 +152,6 @@ void factor_vm::gc(gc_op op, cell requested_bytes, bool trace_contexts_p)
|
||||||
start_gc_again();
|
start_gc_again();
|
||||||
}
|
}
|
||||||
|
|
||||||
if(current_gc->op == collect_aging_op || current_gc->op == collect_to_tenured_op)
|
|
||||||
{
|
|
||||||
if(data->tenured->free_space() <= data->nursery->size + data->aging->size)
|
|
||||||
current_gc->op = collect_full_op;
|
|
||||||
}
|
|
||||||
|
|
||||||
current_gc->event->op = current_gc->op;
|
current_gc->event->op = current_gc->op;
|
||||||
|
|
||||||
switch(current_gc->op)
|
switch(current_gc->op)
|
||||||
|
@ -167,21 +161,27 @@ void factor_vm::gc(gc_op op, cell requested_bytes, bool trace_contexts_p)
|
||||||
break;
|
break;
|
||||||
case collect_aging_op:
|
case collect_aging_op:
|
||||||
collect_aging();
|
collect_aging();
|
||||||
|
if(data->low_memory_p())
|
||||||
|
{
|
||||||
|
current_gc->op = collect_full_op;
|
||||||
|
current_gc->event->op = collect_full_op;
|
||||||
|
collect_full(trace_contexts_p);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case collect_to_tenured_op:
|
case collect_to_tenured_op:
|
||||||
collect_to_tenured();
|
collect_to_tenured();
|
||||||
|
if(data->low_memory_p())
|
||||||
|
{
|
||||||
|
current_gc->op = collect_full_op;
|
||||||
|
current_gc->event->op = collect_full_op;
|
||||||
|
collect_full(trace_contexts_p);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case collect_full_op:
|
case collect_full_op:
|
||||||
collect_mark_impl(trace_contexts_p);
|
collect_full(trace_contexts_p);
|
||||||
collect_sweep_impl();
|
|
||||||
if(data->tenured->largest_free_block() <= data->nursery->size + data->aging->size)
|
|
||||||
collect_compact_impl(trace_contexts_p);
|
|
||||||
else
|
|
||||||
update_code_heap_words_and_literals();
|
|
||||||
break;
|
break;
|
||||||
case collect_compact_op:
|
case collect_compact_op:
|
||||||
collect_mark_impl(trace_contexts_p);
|
collect_compact(trace_contexts_p);
|
||||||
collect_compact_impl(trace_contexts_p);
|
|
||||||
break;
|
break;
|
||||||
case collect_growing_heap_op:
|
case collect_growing_heap_op:
|
||||||
collect_growing_heap(requested_bytes,trace_contexts_p);
|
collect_growing_heap(requested_bytes,trace_contexts_p);
|
||||||
|
|
|
@ -262,8 +262,10 @@ struct factor_vm
|
||||||
void update_code_roots_for_compaction();
|
void update_code_roots_for_compaction();
|
||||||
void collect_mark_impl(bool trace_contexts_p);
|
void collect_mark_impl(bool trace_contexts_p);
|
||||||
void collect_sweep_impl();
|
void collect_sweep_impl();
|
||||||
|
void collect_full(bool trace_contexts_p);
|
||||||
void collect_compact_impl(bool trace_contexts_p);
|
void collect_compact_impl(bool trace_contexts_p);
|
||||||
void collect_compact_code_impl(bool trace_contexts_p);
|
void collect_compact_code_impl(bool trace_contexts_p);
|
||||||
|
void collect_compact(bool trace_contexts_p);
|
||||||
void collect_growing_heap(cell requested_bytes, bool trace_contexts_p);
|
void collect_growing_heap(cell requested_bytes, bool trace_contexts_p);
|
||||||
void gc(gc_op op, cell requested_bytes, bool trace_contexts_p);
|
void gc(gc_op op, cell requested_bytes, bool trace_contexts_p);
|
||||||
void primitive_minor_gc();
|
void primitive_minor_gc();
|
||||||
|
|
Loading…
Reference in New Issue