X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=liblttng-ust%2Flttng-ust-comm.c;h=748417ab3e366a2edb827bd8668e4bdd5cb806ac;hb=5f6daaef86c3b4cff5af523cbbd8f2630634259d;hp=be7dc9f1e6b4db4395f1f75ebc5d28567643263e;hpb=3d3dc207c16d90ecd80eb1e757fe8b94ff317c63;p=lttng-ust.git diff --git a/liblttng-ust/lttng-ust-comm.c b/liblttng-ust/lttng-ust-comm.c index be7dc9f1..748417ab 100644 --- a/liblttng-ust/lttng-ust-comm.c +++ b/liblttng-ust/lttng-ust-comm.c @@ -53,6 +53,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 +352,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 +427,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 +641,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 +2067,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 +2125,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 +2267,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 +2279,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;