in source/hack_parallel/hack_parallel/heap/hh_shared.c [1829:1862]
int hh_mem_inner(value key) {
check_should_exit();
unsigned int slot = find_slot(key);
_Bool good_hash = hashtbl[slot].hash == get_hash(key);
_Bool non_null_addr = hashtbl[slot].addr != NULL;
if (good_hash && non_null_addr) {
// The data is currently in the process of being written, wait until it
// actually is ready to be used before returning.
time_t start = 0;
while (hashtbl[slot].addr == HASHTBL_WRITE_IN_PROGRESS) {
#if defined(__aarch64__) || defined(__powerpc64__)
asm volatile("yield" : : : "memory");
#else
asm volatile("pause" : : : "memory");
#endif
// if the worker writing the data dies, we can get stuck. Timeout check
// to prevent it.
time_t now = time(0);
if (start == 0 || start > now) {
start = now;
} else if (now - start > 60) {
caml_failwith("hh_mem busy-wait loop stuck for 60s");
}
}
return 1;
} else if (good_hash) {
// if the hash matches and the key is zero
// then we've removed the key.
return -2;
} else {
// otherwise the key is simply absent
return -1;
}
}