Пример #1
0
/* 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);
}
Пример #2
0
/* 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);
}
Пример #3
0
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);
}