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);
}