add environment variables to set subbuffer options
[ust.git] / libust / tracectl.c
index 3624b867f6d9f7a39bcae586878b00ae3abdd0b2..ef0155db3388441d83fe3afe813f66b5e78d64e3 100644 (file)
@@ -19,6 +19,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <stdint.h>
+#include <pthread.h>
 #include <signal.h>
 #include <sys/types.h>
 #include <sys/socket.h>
@@ -48,6 +49,8 @@
  */
 s64 pidunique = -1LL;
 
+extern struct chan_info_struct chan_infos[];
+
 struct list_head blocked_consumers = LIST_HEAD_INIT(blocked_consumers);
 
 static struct ustcomm_app ustcomm_app;
@@ -1031,17 +1034,38 @@ static pthread_t listener_thread;
 void create_listener(void)
 {
        int result;
+       sigset_t sig_all_blocked;
+       sigset_t orig_parent_mask;
 
        if(have_listener) {
                WARN("not creating listener because we already had one");
                return;
        }
 
+       /* A new thread created by pthread_create inherits the signal mask
+        * from the parent. To avoid any signal being received by the
+        * listener thread, we block all signals temporarily in the parent,
+        * while we create the listener thread.
+        */
+
+       sigfillset(&sig_all_blocked);
+
+       result = pthread_sigmask(SIG_SETMASK, &sig_all_blocked, &orig_parent_mask);
+       if(result) {
+               PERROR("pthread_sigmask: %s", strerror(result));
+       }
+
        result = pthread_create(&listener_thread, NULL, listener_main, NULL);
        if(result == -1) {
                PERROR("pthread_create");
        }
 
+       /* Restore original signal mask in parent */
+       result = pthread_sigmask(SIG_SETMASK, &orig_parent_mask, NULL);
+       if(result) {
+               PERROR("pthread_sigmask: %s", strerror(result));
+       }
+
        have_listener = 1;
 }
 
@@ -1092,6 +1116,11 @@ static void __attribute__((constructor)) init()
 {
        int result;
        char* autoprobe_val = NULL;
+       char* subbuffer_size_val = NULL;
+       char* subbuffer_count_val = NULL;
+       unsigned int subbuffer_size;
+       unsigned int subbuffer_count;
+       unsigned int power;
 
        /* Assign the pidunique, to be able to differentiate the processes with same
         * pid, (before and after an exec).
@@ -1175,6 +1204,23 @@ static void __attribute__((constructor)) init()
                }
        }
 
+       subbuffer_size_val = getenv("UST_SUBBUF_SIZE");
+       if(subbuffer_size_val) {
+               sscanf(subbuffer_size_val, "%u", &subbuffer_size);
+               power = pow2_higher_or_eq(subbuffer_size);
+               if(power != subbuffer_size)
+                       WARN("using the next power of two for buffer size = %u\n", power);
+               chan_infos[LTT_CHANNEL_UST].def_subbufsize = power;
+       }
+
+       subbuffer_count_val = getenv("UST_SUBBUF_NUM");
+       if(subbuffer_count_val) {
+               sscanf(subbuffer_count_val, "%u", &subbuffer_count);
+               if(subbuffer_count < 2)
+                       subbuffer_count = 2;
+               chan_infos[LTT_CHANNEL_UST].def_subbufcount = subbuffer_count;
+       }
+
        if(getenv("UST_TRACE")) {
                char trace_name[] = "auto";
                char trace_type[] = "ustrelay";
@@ -1241,7 +1287,6 @@ static void __attribute__((constructor)) init()
                inform_consumer_daemon(trace_name);
        }
 
-
        return;
 
        /* should decrementally destroy stuff if error */
This page took 0.02553 seconds and 4 git commands to generate.