X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=libringbuffer%2Fshm.c;h=994204d1e0a2463829a8e73e3cb0cf078eae1c0f;hb=35897f8b2d311b756b81657dad9c53ef1c0fad8a;hp=0d92572d7b5b6170d79ed7e457e115bba957b7ef;hpb=5a61337d8b92f7419e58e5b46ffc4f75ac6269af;p=lttng-ust.git diff --git a/libringbuffer/shm.c b/libringbuffer/shm.c index 0d92572d..994204d1 100644 --- a/libringbuffer/shm.c +++ b/libringbuffer/shm.c @@ -16,7 +16,8 @@ #include #include #include -#include +#include +#include struct shm_object_table *shm_object_table_create(size_t max_nb_obj) { @@ -165,22 +166,59 @@ 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) { int ret, i; - ret = munmap(obj->memory_map, obj->memory_map_size); - if (ret) { - PERROR("umnmap"); - assert(0); - } + if (!obj->is_shadow) { + ret = munmap(obj->memory_map, obj->memory_map_size); + if (ret) { + PERROR("umnmap"); + assert(0); + } + } ret = close(obj->shm_fd); if (ret) { PERROR("close"); 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");