}
memcpy(obj->wait_fd, waitfd, sizeof(waitfd));
- /* create shm */
+ /*
+ * Set POSIX shared memory object size
+ *
+ * First, use ftruncate() to set its size, some implementations won't
+ * allow writes past the size set by ftruncate.
+ * Then, use write() to fill it with zeros, this allows us to fully
+ * allocate it and detect a shortage of shm space without dealing with
+ * a SIGBUS.
+ */
shmfd = stream_fd;
- ret = zero_file(shmfd, memory_map_size);
- if (ret) {
- PERROR("zero_file");
- goto error_zero_file;
- }
ret = ftruncate(shmfd, memory_map_size);
if (ret) {
PERROR("ftruncate");
goto error_ftruncate;
}
+ ret = zero_file(shmfd, memory_map_size);
+ if (ret) {
+ PERROR("zero_file");
+ goto error_zero_file;
+ }
+
/*
* Also ensure the file metadata is synced with the storage by using
- * fsync(2).
+ * fsync(2). Some platforms don't allow fsync on POSIX shm fds, ignore
+ * EINVAL accordingly.
*/
ret = fsync(shmfd);
- if (ret) {
+ if (ret && errno != EINVAL) {
PERROR("fsync");
goto error_fsync;
}