bytecode: Add `OBJECT_TYPE_{UN,}SIGNED_ENUM` type
[lttng-ust.git] / libringbuffer / shm.c
index 461befb99db5ed45cde5dcdcfecb860df06003b3..1ac59f9eee138c2744a5ada5bd58c05476de9800 100644 (file)
@@ -19,7 +19,6 @@
  */
 
 #define _LGPL_SOURCE
-#include <config.h>
 #include "shm.h"
 #include <unistd.h>
 #include <fcntl.h>
@@ -129,25 +128,35 @@ struct shm_object *_shm_object_table_alloc_shm(struct shm_object_table *table,
        }
        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;
        }
@@ -519,6 +528,6 @@ struct shm_ref zalloc_shm(struct shm_object *obj, size_t len)
 
 void align_shm(struct shm_object *obj, size_t align)
 {
-       size_t offset_len = offset_align(obj->allocated_len, align);
+       size_t offset_len = lttng_ust_offset_align(obj->allocated_len, align);
        obj->allocated_len += offset_len;
 }
This page took 0.026129 seconds and 4 git commands to generate.