X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=libringbuffer%2Fshm.c;h=fd0919fac3b75ad057e9c0aed87efd676847a76a;hb=57773204abc43ed7d4350ac0d641ddbbda1e441e;hp=0d92572d7b5b6170d79ed7e457e115bba957b7ef;hpb=5a61337d8b92f7419e58e5b46ffc4f75ac6269af;p=lttng-ust.git diff --git a/libringbuffer/shm.c b/libringbuffer/shm.c index 0d92572d..fd0919fa 100644 --- a/libringbuffer/shm.c +++ b/libringbuffer/shm.c @@ -165,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) { @@ -181,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");