ust: continue implementation of ustd
[ust.git] / libtracing / relay.c
index 0f503a89d56e0d683b2dea853680ca009c9b8c99..a8775ec77d2554e30bee693a1c6a102c49ec91fd 100644 (file)
 //ust// #include <linux/cpu.h>
 //ust// #include <linux/splice.h>
 //ust// #include <linux/bitops.h>
-#include <sys/mman.h>
 #include "kernelcompat.h"
+#include <sys/mman.h>
+#include <sys/ipc.h>
+#include <sys/shm.h>
 #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;
 }
 
 /**
@@ -181,7 +206,7 @@ static void relay_destroy_buf(struct rchan_buf *buf)
 static void relay_remove_buf(struct kref *kref)
 {
        struct rchan_buf *buf = container_of(kref, struct rchan_buf, kref);
-       buf->chan->cb->remove_buf_file(buf);
+//ust//        buf->chan->cb->remove_buf_file(buf);
        relay_destroy_buf(buf);
 }
 
@@ -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)
This page took 0.025667 seconds and 4 git commands to generate.