Refactor event notifier structure
[lttng-ust.git] / liblttng-ust / lttng-ust-comm.c
index 59f14050f1b5dfdd4d53dc73d3730d9387a96142..19ce0ceba780b3aa1c1070244e2207544eb7839d 100644 (file)
@@ -1,22 +1,8 @@
 /*
- * lttng-ust-comm.c
+ * SPDX-License-Identifier: LGPL-2.1-only
  *
  * Copyright (C) 2011 David Goulet <david.goulet@polymtl.ca>
  * Copyright (C) 2011 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; only
- * version 2.1 of the License.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 #define _LGPL_SOURCE
 #include <urcu/compiler.h>
 #include <lttng/urcu/urcu-ust.h>
 
-#include <lttng/align.h>
 #include <lttng/ust-events.h>
 #include <lttng/ust-abi.h>
 #include <lttng/ust.h>
 #include <lttng/ust-error.h>
 #include <lttng/ust-ctl.h>
+#include <lttng/ust-libc-wrapper.h>
 #include <urcu/tls-compat.h>
 #include <ust-comm.h>
 #include <ust-fd.h>
 #include <usterr-signal-safe.h>
-#include <helper.h>
+#include <ust-helper.h>
 #include "tracepoint-internal.h"
 #include "lttng-tracer-core.h"
 #include "compat.h"
@@ -63,6 +49,8 @@
 #include "../libringbuffer/getcpu.h"
 #include "getenv.h"
 #include "ust-events-internal.h"
+#include "context-internal.h"
+#include "ust-compat.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 +361,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);
@@ -407,11 +399,11 @@ const char *get_lttng_home_dir(void)
 {
        const char *val;
 
-       val = (const char *) lttng_getenv("LTTNG_HOME");
+       val = (const char *) lttng_ust_getenv("LTTNG_HOME");
        if (val != NULL) {
                return val;
        }
-       return (const char *) lttng_getenv("HOME");
+       return (const char *) lttng_ust_getenv("HOME");
 }
 
 /*
@@ -430,17 +422,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();
@@ -561,7 +553,7 @@ long get_timeout(void)
        long constructor_delay_ms = LTTNG_UST_DEFAULT_CONSTRUCTOR_TIMEOUT_MS;
 
        if (!got_timeout_env) {
-               str_timeout = lttng_getenv("LTTNG_UST_REGISTER_TIMEOUT");
+               str_timeout = lttng_ust_getenv("LTTNG_UST_REGISTER_TIMEOUT");
                got_timeout_env = 1;
        }
        if (str_timeout)
@@ -628,7 +620,7 @@ static
 void get_allow_blocking(void)
 {
        const char *str_allow_blocking =
-               lttng_getenv("LTTNG_UST_ALLOW_BLOCKING");
+               lttng_ust_getenv("LTTNG_UST_ALLOW_BLOCKING");
 
        if (str_allow_blocking) {
                DBG("%s environment variable is set",
@@ -772,7 +764,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 +821,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 +834,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;
 }
 
@@ -971,23 +955,18 @@ int handle_message(struct sock_info *sock_info,
                                goto error;
                        }
                }
-               if (ops->cmd) {
+               if (ops->cmd)
                        ret = ops->cmd(lum->handle, lum->cmd,
-                                       (unsigned long) node,
+                                       (unsigned long) &node,
                                        &args, sock_info);
-                       if (ret) {
-                               free(node);
-                       }
-                       /* Don't free exclusion data if everything went fine. */
-               } else {
+               else
                        ret = -ENOSYS;
-                       free(node);
-               }
+               free(node);
                break;
        }
        case LTTNG_UST_EVENT_NOTIFIER_GROUP_CREATE:
        {
-               int event_notifier_notif_fd;
+               int event_notifier_notif_fd, close_ret;
 
                len = ustcomm_recv_event_notifier_notif_fd_from_sessiond(sock,
                        &event_notifier_notif_fd);
@@ -1024,6 +1003,13 @@ int handle_message(struct sock_info *sock_info,
                                        &args, sock_info);
                else
                        ret = -ENOSYS;
+               if (args.event_notifier_handle.event_notifier_notif_fd >= 0) {
+                       lttng_ust_lock_fd_tracker();
+                       close_ret = close(args.event_notifier_handle.event_notifier_notif_fd);
+                       lttng_ust_unlock_fd_tracker();
+                       if (close_ret)
+                               PERROR("close");
+               }
                break;
        }
        case LTTNG_UST_CHANNEL:
@@ -1065,10 +1051,23 @@ int handle_message(struct sock_info *sock_info,
                                        &args, sock_info);
                else
                        ret = -ENOSYS;
+               if (args.channel.wakeup_fd >= 0) {
+                       int close_ret;
+
+                       lttng_ust_lock_fd_tracker();
+                       close_ret = close(args.channel.wakeup_fd);
+                       lttng_ust_unlock_fd_tracker();
+                       args.channel.wakeup_fd = -1;
+                       if (close_ret)
+                               PERROR("close");
+               }
+               free(args.channel.chan_data);
                break;
        }
        case LTTNG_UST_STREAM:
        {
+               int close_ret;
+
                /* Receive shm_fd, wakeup_fd */
                ret = ustcomm_recv_stream_from_sessiond(sock,
                        NULL,
@@ -1084,6 +1083,22 @@ int handle_message(struct sock_info *sock_info,
                                        &args, sock_info);
                else
                        ret = -ENOSYS;
+               if (args.stream.shm_fd >= 0) {
+                       lttng_ust_lock_fd_tracker();
+                       close_ret = close(args.stream.shm_fd);
+                       lttng_ust_unlock_fd_tracker();
+                       args.stream.shm_fd = -1;
+                       if (close_ret)
+                               PERROR("close");
+               }
+               if (args.stream.wakeup_fd >= 0) {
+                       lttng_ust_lock_fd_tracker();
+                       close_ret = close(args.stream.wakeup_fd);
+                       lttng_ust_unlock_fd_tracker();
+                       args.stream.wakeup_fd = -1;
+                       if (close_ret)
+                               PERROR("close");
+               }
                break;
        }
        case LTTNG_UST_CONTEXT:
@@ -1180,6 +1195,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:
@@ -1197,6 +1213,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:
@@ -1214,6 +1240,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:
@@ -1683,7 +1719,7 @@ void wait_for_sessiond(struct sock_info *sock_info)
 "Please upgrade your kernel "
 "(fix is commit 9ea71503a8ed9184d2d0b8ccc4d269d05f7940ae in Linux kernel "
 "mainline). LTTng-UST will use polling mode fallback.");
-                       if (ust_debug())
+                       if (ust_err_debug_enabled())
                                PERROR("futex");
                        goto end_wait;
                }
@@ -2017,7 +2053,7 @@ quit:
  * Weak symbol to call when the ust malloc wrapper is not loaded.
  */
 __attribute__((weak))
-void lttng_ust_malloc_wrapper_init(void)
+void lttng_ust_libc_wrapper_malloc_init(void)
 {
 }
 
@@ -2072,9 +2108,9 @@ void __attribute__((constructor)) lttng_ust_init(void)
         * sessiond (otherwise leading to errors when trying to create
         * sessiond before the init functions are completed).
         */
-       init_usterr();
-       lttng_ust_getenv_init();        /* Needs init_usterr() to be completed. */
-       init_tracepoint();
+       ust_err_init();
+       lttng_ust_getenv_init();        /* Needs ust_err_init() to be completed. */
+       lttng_ust_tp_init();
        lttng_ust_init_fd_tracker();
        lttng_ust_clock_init();
        lttng_ust_getcpu_init();
@@ -2090,7 +2126,7 @@ void __attribute__((constructor)) lttng_ust_init(void)
        /*
         * Invoke ust malloc wrapper init before starting other threads.
         */
-       lttng_ust_malloc_wrapper_init();
+       lttng_ust_libc_wrapper_malloc_init();
 
        timeout_mode = get_constructor_timeout(&constructor_timeout);
 
@@ -2234,7 +2270,7 @@ void lttng_ust_cleanup(int exiting)
        lttng_counter_client_percpu_32_modular_exit();
        lttng_counter_client_percpu_64_modular_exit();
        lttng_ust_statedump_destroy();
-       exit_tracepoint();
+       lttng_ust_tp_exit();
        if (!exiting) {
                /* Reinitialize values for fork */
                sem_count = sem_count_initial_value;
@@ -2358,8 +2394,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();
 }
@@ -2388,8 +2422,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);
 }
@@ -2416,8 +2448,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);
This page took 0.029504 seconds and 4 git commands to generate.