X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=liblttng-ust%2Flttng-ust-comm.c;h=347a2e09fa3d5b5b61cf74eaf2f7a8fc99265156;hb=5287fad0d44dd62029a23d0b44fcd3c95574345a;hp=69bce955491db27da8b3c8818da605f9a50a6f5d;hpb=e9fe6aad66010614f987e917866837706d19053b;p=lttng-ust.git diff --git a/liblttng-ust/lttng-ust-comm.c b/liblttng-ust/lttng-ust-comm.c index 69bce955..347a2e09 100644 --- a/liblttng-ust/lttng-ust-comm.c +++ b/liblttng-ust/lttng-ust-comm.c @@ -63,6 +63,7 @@ #include "../libringbuffer/getcpu.h" #include "getenv.h" #include "ust-events-internal.h" +#include "context-internal.h" /* Concatenate lttng ust shared library name with its major version number. */ #define LTTNG_UST_LIB_SO_NAME "liblttng-ust.so." __ust_stringify(CONFIG_LTTNG_UST_LIBRARY_VERSION_MAJOR) @@ -373,9 +374,13 @@ 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); +LTTNG_HIDDEN extern void lttng_counter_client_percpu_32_modular_init(void); +LTTNG_HIDDEN extern void lttng_counter_client_percpu_32_modular_exit(void); +LTTNG_HIDDEN extern void lttng_counter_client_percpu_64_modular_init(void); +LTTNG_HIDDEN extern void lttng_counter_client_percpu_64_modular_exit(void); static char *get_map_shm(struct sock_info *sock_info); @@ -430,17 +435,17 @@ void lttng_fixup_ust_mutex_nest_tls(void) } /* - * Fixup urcu bp TLS. + * Fixup lttng-ust urcu TLS. */ static -void lttng_fixup_urcu_bp_tls(void) +void lttng_fixup_lttng_ust_urcu_tls(void) { (void) lttng_ust_urcu_read_ongoing(); } void lttng_ust_fixup_tls(void) { - lttng_fixup_urcu_bp_tls(); + lttng_fixup_lttng_ust_urcu_tls(); lttng_fixup_ringbuffer_tls(); lttng_fixup_vtid_tls(); lttng_fixup_nest_count_tls(); @@ -772,7 +777,7 @@ static int handle_bytecode_recv(struct sock_info *sock_info, int sock, struct ustcomm_ust_msg *lum) { - struct lttng_ust_bytecode_node *bytecode; + struct lttng_ust_bytecode_node *bytecode = NULL; enum lttng_ust_bytecode_node_type type; const struct lttng_ust_objd_ops *ops; uint32_t data_size, data_size_max, reloc_offset; @@ -829,7 +834,7 @@ int handle_bytecode_recv(struct sock_info *sock_info, switch (len) { case 0: /* orderly shutdown */ ret = 0; - goto error_free_bytecode; + goto end; default: if (len == bytecode->bc.len) { DBG("Bytecode %s data received", @@ -842,41 +847,33 @@ int handle_bytecode_recv(struct sock_info *sock_info, ERR("%s remote end closed connection", sock_info->name); ret = len; - goto error_free_bytecode; + goto end; } ret = len; - goto error_free_bytecode; + goto end; } else { DBG("Incorrect %s bytecode data message size: %zd", bytecode_type_str(lum->cmd), len); ret = -EINVAL; - goto error_free_bytecode; + goto end; } } ops = objd_ops(lum->handle); if (!ops) { ret = -ENOENT; - goto error_free_bytecode; + goto end; } - if (ops->cmd) { + if (ops->cmd) ret = ops->cmd(lum->handle, lum->cmd, - (unsigned long) bytecode, + (unsigned long) &bytecode, NULL, sock_info); - if (ret) - goto error_free_bytecode; - /* don't free bytecode if everything went fine. */ - } else { + else ret = -ENOSYS; - goto error_free_bytecode; - } - goto end; - -error_free_bytecode: - free(bytecode); end: + free(bytecode); return ret; } @@ -1211,6 +1208,7 @@ int handle_message(struct sock_info *sock_info, &args, sock_info); else ret = -ENOSYS; + free(args.counter.counter_data); break; } case LTTNG_UST_COUNTER_GLOBAL: @@ -1228,6 +1226,16 @@ int handle_message(struct sock_info *sock_info, &args, sock_info); else ret = -ENOSYS; + if (args.counter_shm.shm_fd >= 0) { + int close_ret; + + lttng_ust_lock_fd_tracker(); + close_ret = close(args.counter_shm.shm_fd); + lttng_ust_unlock_fd_tracker(); + args.counter_shm.shm_fd = -1; + if (close_ret) + PERROR("close"); + } break; } case LTTNG_UST_COUNTER_CPU: @@ -1245,6 +1253,16 @@ int handle_message(struct sock_info *sock_info, &args, sock_info); else ret = -ENOSYS; + if (args.counter_shm.shm_fd >= 0) { + int close_ret; + + lttng_ust_lock_fd_tracker(); + close_ret = close(args.counter_shm.shm_fd); + lttng_ust_unlock_fd_tracker(); + args.counter_shm.shm_fd = -1; + if (close_ret) + PERROR("close"); + } break; } case LTTNG_UST_EVENT_NOTIFIER_CREATE: @@ -2389,8 +2407,6 @@ void ust_before_fork(sigset_t *save_sigset) ust_lock_nocheck(); lttng_ust_urcu_before_fork(); - if (lttng_ust_liburcu_bp_before_fork) - lttng_ust_liburcu_bp_before_fork(); lttng_ust_lock_fd_tracker(); lttng_perf_lock(); } @@ -2419,8 +2435,6 @@ void ust_after_fork_parent(sigset_t *restore_sigset) return; DBG("process %d", getpid()); lttng_ust_urcu_after_fork_parent(); - if (lttng_ust_liburcu_bp_after_fork_parent) - lttng_ust_liburcu_bp_after_fork_parent(); /* Release mutexes and reenable signals */ ust_after_fork_common(restore_sigset); } @@ -2447,8 +2461,6 @@ void ust_after_fork_child(sigset_t *restore_sigset) DBG("process %d", getpid()); /* Release urcu mutexes */ lttng_ust_urcu_after_fork_child(); - if (lttng_ust_liburcu_bp_after_fork_child) - lttng_ust_liburcu_bp_after_fork_child(); lttng_ust_cleanup(0); /* Release mutexes and reenable signals */ ust_after_fork_common(restore_sigset);