X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=libtracing%2Frelay.c;h=a8775ec77d2554e30bee693a1c6a102c49ec91fd;hb=3847c3bab100bfb6b01b5654c2429a5d0d162ff5;hp=ad22727a5f7102e731ed7cda741f00f847fa5d66;hpb=98963de4a2dfae12d8aafa0f9a6d97cf4a44e12d;p=ust.git diff --git a/libtracing/relay.c b/libtracing/relay.c index ad22727..a8775ec 100644 --- a/libtracing/relay.c +++ b/libtracing/relay.c @@ -22,8 +22,10 @@ //ust// #include //ust// #include //ust// #include -#include #include "kernelcompat.h" +#include +#include +#include #include "list.h" #include "relay.h" #include "channels.h" @@ -93,21 +95,44 @@ static int relay_alloc_buf(struct rchan_buf *buf, size_t *size) unsigned int n_pages; struct buf_page *buf_page, *n; - void *result; + void *ptr; + int result; *size = PAGE_ALIGN(*size); - /* Maybe do read-ahead */ - result = mmap(NULL, *size, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); - if(result == MAP_FAILED) { - PERROR("mmap"); + result = buf->shmid = shmget(getpid(), *size, IPC_CREAT | IPC_EXCL | 0700); + if(buf->shmid == -1) { + PERROR("shmget"); + return -1; + } + + ptr = shmat(buf->shmid, NULL, 0); + if(ptr == (void *) -1) { + perror("shmat"); + goto destroy_shmem; + } + + /* Already mark the shared memory for destruction. This will occur only + * when all users have detached. + */ + result = shmctl(buf->shmid, IPC_RMID, NULL); + if(result == -1) { + perror("shmctl"); return -1; } - buf->buf_data = result; + buf->buf_data = ptr; buf->buf_size = *size; return 0; + + destroy_shmem: + result = shmctl(buf->shmid, IPC_RMID, NULL); + if(result == -1) { + perror("shmctl"); + } + + return -1; } /** @@ -2344,9 +2369,14 @@ static struct ltt_transport ust_relay_transport = { //ust// return 0; //ust// } -void init_ustrelay_transport(void) +static char initialized = 0; + +void __attribute__((constructor)) init_ustrelay_transport(void) { - ltt_transport_register(&ust_relay_transport); + if(!initialized) { + ltt_transport_register(&ust_relay_transport); + initialized = 1; + } } static void __exit ltt_relay_exit(void)