in source/hack_parallel/hack_parallel/heap/hh_shared.c [638:695]
void memfd_init(
const char* shm_dir,
size_t shared_mem_size,
uint64_t minimum_avail) {
if (shm_dir == NULL) {
// This means that we should try to use the anonymous-y system calls
#if defined(MEMFD_CREATE)
memfd = memfd_create("fb_heap", 0);
#endif
#if defined(__APPLE__)
if (memfd < 0) {
char memname[255];
snprintf(memname, sizeof(memname), "/fb_heap.%d", getpid());
// the ftruncate below will fail with errno EINVAL if you try to
// ftruncate the same sharedmem fd more than once. We're seeing this in
// some tests, which might imply that two flow processes with the same
// pid are starting up. This shm_unlink should prevent that from
// happening. Here's a stackoverflow about it
// http://stackoverflow.com/questions/25502229/ftruncate-not-working-on-posix-shared-memory-in-mac-os-x
shm_unlink(memname);
memfd = shm_open(memname, O_CREAT | O_RDWR, 0666);
if (memfd < 0) {
uerror("shm_open", Nothing);
}
// shm_open sets FD_CLOEXEC automatically. This is undesirable, because
// we want this fd to be open for other processes, so that they can
// reconnect to the shared memory.
int fcntl_flags = fcntl(memfd, F_GETFD);
if (fcntl_flags == -1) {
printf("Error with fcntl(memfd): %s\n", strerror(errno));
uerror("fcntl", Nothing);
}
// Unset close-on-exec
fcntl(memfd, F_SETFD, fcntl_flags & ~FD_CLOEXEC);
}
#endif
if (memfd < 0) {
raise_failed_anonymous_memfd_init();
}
} else {
assert_avail_exceeds_minimum(shm_dir, minimum_avail);
if (memfd < 0) {
char template[1024];
if (!snprintf(template, 1024, "%s/fb_heap-XXXXXX", shm_dir)) {
uerror("snprintf", Nothing);
};
memfd = mkstemp(template);
if (memfd < 0) {
uerror("mkstemp", caml_copy_string(template));
}
unlink(template);
}
}
if (ftruncate(memfd, shared_mem_size) == -1) {
uerror("ftruncate", Nothing);
}
}