CAMLprim value hh_shared_init()

in source/hack_parallel/hack_parallel/heap/hh_shared.c [947:1009]


CAMLprim value hh_shared_init(value config_val, value shm_dir_val) {
  CAMLparam2(config_val, shm_dir_val);
  CAMLlocal5(
      connector,
      config_global_size_val,
      config_heap_size_val,
      config_dep_table_pow_val,
      config_hash_table_pow_val);

  config_global_size_val = Field(config_val, 0);
  config_heap_size_val = Field(config_val, 1);
  config_dep_table_pow_val = Field(config_val, 2);
  config_hash_table_pow_val = Field(config_val, 3);

  set_sizes(
      Long_val(config_global_size_val),
      Long_val(config_heap_size_val),
      Long_val(config_dep_table_pow_val),
      Long_val(config_hash_table_pow_val));

  // None -> NULL
  // Some str -> String_val(str)
  const char* shm_dir =
      (shm_dir_val == Val_int(0)) ? NULL : String_val(Field(shm_dir_val, 0));

  memfd_init(shm_dir, shared_mem_size, Long_val(Field(config_val, 5)));
  char* shared_mem_init = memfd_map(shared_mem_size);
  define_globals(shared_mem_init);

  // Keeping the pids around to make asserts.
#ifdef _WIN32
  *master_pid = 0;
  my_pid = *master_pid;
#else
  *master_pid = getpid();
  my_pid = *master_pid;
#endif

  init_shared_globals(Long_val(Field(config_val, 6)));
  // Checking that we did the maths correctly.
  assert(*heap + heap_size == shared_mem + shared_mem_size);

#ifndef _WIN32
  // Uninstall ocaml's segfault handler. It's supposed to throw an exception on
  // stack overflow, but we don't actually handle that exception, so what
  // happens in practice is we terminate at toplevel with an unhandled exception
  // and a useless ocaml backtrace. A core dump is actually more useful. Sigh.
  struct sigaction sigact = {0};
  sigact.sa_handler = SIG_DFL;
  sigemptyset(&sigact.sa_mask);
  sigact.sa_flags = 0;
  sigaction(SIGSEGV, &sigact, NULL);
#endif

  connector = caml_alloc_tuple(5);
  Field(connector, 0) = Val_handle(memfd);
  Field(connector, 1) = config_global_size_val;
  Field(connector, 2) = config_heap_size_val;
  Field(connector, 3) = config_dep_table_pow_val;
  Field(connector, 4) = config_hash_table_pow_val;

  CAMLreturn(connector);
}