X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=libringbuffer%2Fshm.c;h=fc7fbfb2c0642ca0c410ddae0c6cd1a45b5a792e;hb=4318ae1be57eb7983ab4857a7a8eeb4a030a8216;hp=d86abb98e210fadece1e35a01e55fd7d29a07f90;hpb=8da6cd6d27941d7b3b67ea1878e32a0c20206468;p=lttng-ust.git diff --git a/libringbuffer/shm.c b/libringbuffer/shm.c index d86abb98..fc7fbfb2 100644 --- a/libringbuffer/shm.c +++ b/libringbuffer/shm.c @@ -16,7 +16,7 @@ #include #include #include -#include +#include struct shm_object_table *shm_object_table_create(size_t max_nb_obj) { @@ -31,7 +31,7 @@ struct shm_object_table *shm_object_table_create(size_t max_nb_obj) struct shm_object *shm_object_table_append(struct shm_object_table *table, size_t memory_map_size) { - int shmfd, waitfd[2], ret, i; + int shmfd, waitfd[2], ret, i, sigblocked = 0; struct shm_object *obj; char *memory_map; char tmp_name[NAME_MAX] = "ust-shm-tmp-XXXXXX"; @@ -75,6 +75,7 @@ struct shm_object *shm_object_table_append(struct shm_object_table *table, PERROR("pthread_sigmask"); goto error_pthread_sigmask; } + sigblocked = 1; /* * Allocate shm, and immediately unlink its shm oject, keeping @@ -107,10 +108,11 @@ struct shm_object *shm_object_table_append(struct shm_object_table *table, PERROR("shm_unlink"); goto error_shm_release; } + sigblocked = 0; ret = pthread_sigmask(SIG_SETMASK, &orig_sigs, NULL); if (ret == -1) { PERROR("pthread_sigmask"); - goto error_shm_release; + goto error_sigmask_release; } ret = ftruncate(shmfd, memory_map_size); if (ret) { @@ -136,12 +138,19 @@ struct shm_object *shm_object_table_append(struct shm_object_table *table, error_mmap: error_ftruncate: error_shm_release: +error_sigmask_release: ret = close(shmfd); if (ret) { PERROR("close"); assert(0); } error_shm_open: + if (sigblocked) { + ret = pthread_sigmask(SIG_SETMASK, &orig_sigs, NULL); + if (ret == -1) { + PERROR("pthread_sigmask"); + } + } error_pthread_sigmask: error_fcntl: for (i = 0; i < 2; i++) { @@ -156,6 +165,39 @@ error_pipe: } +struct shm_object *shm_object_table_append_shadow(struct shm_object_table *table, + int shm_fd, int wait_fd, size_t memory_map_size) +{ + struct shm_object *obj; + char *memory_map; + + if (table->allocated_len >= table->size) + return NULL; + obj = &table->objects[table->allocated_len]; + + /* wait_fd: set read end of the pipe. */ + obj->wait_fd[0] = wait_fd; + obj->wait_fd[1] = -1; /* write end is unset. */ + obj->shm_fd = shm_fd; + + /* memory_map: mmap */ + memory_map = mmap(NULL, memory_map_size, PROT_READ | PROT_WRITE, + MAP_SHARED, shm_fd, 0); + if (memory_map == MAP_FAILED) { + PERROR("mmap"); + goto error_mmap; + } + obj->memory_map = memory_map; + obj->memory_map_size = memory_map_size; + obj->allocated_len = memory_map_size; + obj->index = table->allocated_len++; + + return obj; + +error_mmap: + return NULL; +} + static void shmp_object_destroy(struct shm_object *obj) { @@ -172,6 +214,8 @@ void shmp_object_destroy(struct shm_object *obj) assert(0); } for (i = 0; i < 2; i++) { + if (obj->wait_fd[i] < 0) + continue; ret = close(obj->wait_fd[i]); if (ret) { PERROR("close");