Fix: pass private data to context callbacks
[lttng-ust.git] / liblttng-ust / lttng-ust-comm.c
index be7dc9f1e6b4db4395f1f75ebc5d28567643263e..c0a7311fa66e7797c62c8a207a429e28ad190dcf 100644 (file)
@@ -36,6 +36,7 @@
 #include <lttng/ust-error.h>
 #include <lttng/ust-ctl.h>
 #include <lttng/ust-libc-wrapper.h>
+#include <lttng/ust-thread.h>
 #include <lttng/ust-tracer.h>
 #include <urcu/tls-compat.h>
 #include <ust-comm.h>
@@ -53,6 +54,8 @@
 #include "ust-events-internal.h"
 #include "context-internal.h"
 #include "ust-compat.h"
+#include "lttng-counter-client.h"
+#include "lttng-rb-clients.h"
 
 /*
  * Has lttng ust comm constructor been called ?
@@ -350,29 +353,6 @@ static const char *cmd_name_mapping[] = {
 static const char *str_timeout;
 static int got_timeout_env;
 
-extern void lttng_ring_buffer_client_overwrite_init(void);
-extern void lttng_ring_buffer_client_overwrite_rt_init(void);
-extern void lttng_ring_buffer_client_discard_init(void);
-extern void lttng_ring_buffer_client_discard_rt_init(void);
-extern void lttng_ring_buffer_metadata_client_init(void);
-extern void lttng_ring_buffer_client_overwrite_exit(void);
-extern void lttng_ring_buffer_client_overwrite_rt_exit(void);
-extern void lttng_ring_buffer_client_discard_exit(void);
-extern void lttng_ring_buffer_client_discard_rt_exit(void);
-extern void lttng_ring_buffer_metadata_client_exit(void);
-
-__attribute__((visibility("hidden")))
-extern void lttng_counter_client_percpu_32_modular_init(void);
-
-__attribute__((visibility("hidden")))
-extern void lttng_counter_client_percpu_32_modular_exit(void);
-
-__attribute__((visibility("hidden")))
-extern void lttng_counter_client_percpu_64_modular_init(void);
-
-__attribute__((visibility("hidden")))
-extern void lttng_counter_client_percpu_64_modular_exit(void);
-
 static char *get_map_shm(struct sock_info *sock_info);
 
 ssize_t lttng_ust_read(int fd, void *buf, size_t len)
@@ -448,6 +428,31 @@ void lttng_ust_fixup_tls(void)
        lttng_fixup_net_ns_tls();
        lttng_fixup_time_ns_tls();
        lttng_fixup_uts_ns_tls();
+       lttng_ust_fixup_ring_buffer_client_discard_tls();
+       lttng_ust_fixup_ring_buffer_client_discard_rt_tls();
+       lttng_ust_fixup_ring_buffer_client_overwrite_tls();
+       lttng_ust_fixup_ring_buffer_client_overwrite_rt_tls();
+}
+
+/*
+ * LTTng-UST uses Global Dynamic model TLS variables rather than IE
+ * model because many versions of glibc don't preallocate a pool large
+ * enough for TLS variables IE model defined in other shared libraries,
+ * and causes issues when using LTTng-UST for Java tracing.
+ *
+ * Because of this use of Global Dynamic TLS variables, users wishing to
+ * trace from signal handlers need to explicitly trigger the lazy
+ * allocation of those variables for each thread before using them.
+ * This can be triggered by calling lttng_ust_init_thread().
+ */
+void lttng_ust_init_thread(void)
+{
+       /*
+        * Because those TLS variables are global dynamic, we need to
+        * ensure those are initialized before a signal handler nesting over
+        * this thread attempts to use them.
+        */
+       lttng_ust_fixup_tls();
 }
 
 int lttng_get_notify_socket(void *owner)
@@ -637,11 +642,11 @@ int register_to_sessiond(int socket, enum ustctl_socket_type type)
        return ustcomm_send_reg_msg(socket,
                type,
                CAA_BITS_PER_LONG,
-               lttng_alignof(uint8_t) * CHAR_BIT,
-               lttng_alignof(uint16_t) * CHAR_BIT,
-               lttng_alignof(uint32_t) * CHAR_BIT,
-               lttng_alignof(uint64_t) * CHAR_BIT,
-               lttng_alignof(unsigned long) * CHAR_BIT);
+               lttng_ust_rb_alignof(uint8_t) * CHAR_BIT,
+               lttng_ust_rb_alignof(uint16_t) * CHAR_BIT,
+               lttng_ust_rb_alignof(uint32_t) * CHAR_BIT,
+               lttng_ust_rb_alignof(uint64_t) * CHAR_BIT,
+               lttng_ust_rb_alignof(unsigned long) * CHAR_BIT);
 }
 
 static
@@ -2063,7 +2068,11 @@ void lttng_ust_libc_wrapper_malloc_init(void)
  * sessiond monitoring thread: monitor presence of global and per-user
  * sessiond by polling the application common named pipe.
  */
-void __attribute__((constructor)) lttng_ust_init(void)
+static
+void lttng_ust_init(void)
+       __attribute__((constructor));
+static
+void lttng_ust_init(void)
 {
        struct timespec constructor_timeout;
        sigset_t sig_all_blocked, orig_parent_mask;
@@ -2117,13 +2126,8 @@ void __attribute__((constructor)) lttng_ust_init(void)
        lttng_ust_clock_init();
        lttng_ust_getcpu_init();
        lttng_ust_statedump_init();
-       lttng_ring_buffer_metadata_client_init();
-       lttng_ring_buffer_client_overwrite_init();
-       lttng_ring_buffer_client_overwrite_rt_init();
-       lttng_ring_buffer_client_discard_init();
-       lttng_ring_buffer_client_discard_rt_init();
-       lttng_counter_client_percpu_32_modular_init();
-       lttng_counter_client_percpu_64_modular_init();
+       lttng_ust_ring_buffer_clients_init();
+       lttng_ust_counter_clients_init();
        lttng_perf_counter_init();
        /*
         * Invoke ust malloc wrapper init before starting other threads.
@@ -2264,13 +2268,8 @@ void lttng_ust_cleanup(int exiting)
        lttng_ust_abi_exit();
        lttng_ust_abi_events_exit();
        lttng_perf_counter_exit();
-       lttng_ring_buffer_client_discard_rt_exit();
-       lttng_ring_buffer_client_discard_exit();
-       lttng_ring_buffer_client_overwrite_rt_exit();
-       lttng_ring_buffer_client_overwrite_exit();
-       lttng_ring_buffer_metadata_client_exit();
-       lttng_counter_client_percpu_32_modular_exit();
-       lttng_counter_client_percpu_64_modular_exit();
+       lttng_ust_ring_buffer_clients_exit();
+       lttng_ust_counter_clients_exit();
        lttng_ust_statedump_destroy();
        lttng_ust_tp_exit();
        if (!exiting) {
@@ -2281,7 +2280,11 @@ void lttng_ust_cleanup(int exiting)
        }
 }
 
-void __attribute__((destructor)) lttng_ust_exit(void)
+static
+void lttng_ust_exit(void)
+       __attribute__((destructor));
+static
+void lttng_ust_exit(void)
 {
        int ret;
 
This page took 0.025463 seconds and 4 git commands to generate.