/* size in bytes */ void caml_set_minor_heap_size (asize_t size) { if (caml_domain_state->young_ptr != caml_domain_state->young_end) caml_minor_collection (); caml_reallocate_minor_heap(size); reset_table (&caml_domain_state->remembered_set->ref); }
/* must be run on the domain's thread */ static void create_domain(uintnat initial_minor_heap_size, int is_main) { int i; dom_internal* d = 0; Assert (domain_self == 0); caml_plat_lock(&all_domains_lock); for (i = 0; i < Max_domains; i++) { if (!all_domains[i].running) { d = &all_domains[i]; break; } } if (d) { d->running = 1; d->state.is_main = is_main; d->state.vm_inited = 0; d->state.internals = d; /* FIXME: shutdown RPC? */ atomic_store_rel(&d->rpc_request, RPC_IDLE); domain_self = d; caml_domain_state = (void*)(d->tls_area); caml_plat_lock(&d->roots_lock); if (!d->interrupt_word_address) { caml_mem_commit((void*)d->tls_area, (d->tls_area_end - d->tls_area)); atomic_uintnat* young_limit = (atomic_uintnat*)&caml_domain_state->young_limit; d->interrupt_word_address = young_limit; atomic_store_rel(young_limit, d->minor_heap_area); } caml_domain_state->young_start = caml_domain_state->young_end = caml_domain_state->young_ptr = 0; d->state.shared_heap = caml_init_shared_heap(); caml_init_major_gc(); caml_reallocate_minor_heap(initial_minor_heap_size); caml_init_main_stack(); d->state.remembered_set = &caml_remembered_set; d->state.local_roots = &caml_local_roots; #ifdef NATIVE_CODE /* FIXME */ #else d->state.current_stack = &caml_current_stack; #endif d->state.state = caml_domain_state; d->state.mark_stack = &caml_mark_stack; d->state.mark_stack_count = &caml_mark_stack_count; d->state.vm_inited = 1; } caml_plat_unlock(&all_domains_lock); }
void caml_set_minor_heap_size (asize_t wsize) { caml_domain_state* domain_state = Caml_state; struct caml_minor_tables *r = domain_state->minor_tables; if (domain_state->young_ptr != domain_state->young_end) caml_minor_collection (); caml_reallocate_minor_heap(wsize); reset_table ((struct generic_table *)&r->major_ref); reset_table ((struct generic_table *)&r->minor_ref); reset_table ((struct generic_table *)&r->ephe_ref); reset_table((struct generic_table *)&r->custom); }