Rename public structure to avoid collisions
[lttng-ust.git] / include / lttng / tracepoint.h
index fb635c111327e86a20a6898d364f3e175acb9a85..63759a20ee3da5f7a7e0beb6f08219c8567abe55 100644 (file)
  * SOFTWARE.
  */
 
+#include <stdio.h>
+#include <stdlib.h>
 #include <lttng/tracepoint-types.h>
 #include <lttng/tracepoint-rcu.h>
 #include <urcu/compiler.h>
 #include <dlfcn.h>     /* for dlopen */
 #include <string.h>    /* for memset */
-#include <assert.h>
 #include <lttng/ust-config.h>  /* for sdt */
 #include <lttng/ust-compiler.h>
 
@@ -144,14 +145,19 @@ extern "C" {
 #define _TP_ARGS_DATA_VAR(...)         _TP_DATA_VAR_N(_TP_NARGS(0, ##__VA_ARGS__), ##__VA_ARGS__)
 #define _TP_PARAMS(...)                        __VA_ARGS__
 
+/*
+ * The tracepoint cb is marked always inline so we can distinguish
+ * between caller's ip addresses within the probe using the return
+ * address.
+ */
 #define _DECLARE_TRACEPOINT(_provider, _name, ...)                                     \
-extern struct tracepoint __tracepoint_##_provider##___##_name;                         \
-static inline lttng_ust_notrace                                                                \
+extern struct lttng_ust_tracepoint __tracepoint_##_provider##___##_name;               \
+static inline __attribute__((always_inline, unused)) lttng_ust_notrace                 \
 void __tracepoint_cb_##_provider##___##_name(_TP_ARGS_PROTO(__VA_ARGS__));             \
-static inline                                                                          \
+static                                                                                 \
 void __tracepoint_cb_##_provider##___##_name(_TP_ARGS_PROTO(__VA_ARGS__))              \
 {                                                                                      \
-       struct tracepoint_probe *__tp_probe;                                            \
+       struct lttng_ust_tracepoint_probe *__tp_probe;                                          \
                                                                                        \
        if (caa_unlikely(!TP_RCU_LINK_TEST()))                                          \
                return;                                                                 \
@@ -160,7 +166,7 @@ void __tracepoint_cb_##_provider##___##_name(_TP_ARGS_PROTO(__VA_ARGS__))           \
        if (caa_unlikely(!__tp_probe))                                                  \
                goto end;                                                               \
        do {                                                                            \
-               void (*__tp_cb)(void) = __tp_probe->func;                                       \
+               void (*__tp_cb)(void) = __tp_probe->func;                               \
                void *__tp_data = __tp_probe->data;                                     \
                                                                                        \
                URCU_FORCE_CAST(void (*)(_TP_ARGS_DATA_PROTO(__VA_ARGS__)), __tp_cb)    \
@@ -198,12 +204,12 @@ extern int __tracepoint_probe_unregister(const char *name, void (*func)(void),
  * tracepoint dynamic linkage handling (callbacks). Hidden visibility:
  * shared across objects in a module/main executable.
  */
-struct tracepoint_dlopen {
+struct lttng_ust_tracepoint_dlopen {
        void *liblttngust_handle;
 
-       int (*tracepoint_register_lib)(struct tracepoint * const *tracepoints_start,
+       int (*tracepoint_register_lib)(struct lttng_ust_tracepoint * const *tracepoints_start,
                int tracepoints_count);
-       int (*tracepoint_unregister_lib)(struct tracepoint * const *tracepoints_start);
+       int (*tracepoint_unregister_lib)(struct lttng_ust_tracepoint * const *tracepoints_start);
 #ifndef _LGPL_SOURCE
        void (*rcu_read_lock_sym_bp)(void);
        void (*rcu_read_unlock_sym_bp)(void);
@@ -211,7 +217,7 @@ struct tracepoint_dlopen {
 #endif
 };
 
-extern struct tracepoint_dlopen tracepoint_dlopen;
+extern struct lttng_ust_tracepoint_dlopen tracepoint_dlopen;
 
 #if defined(TRACEPOINT_DEFINE) || defined(TRACEPOINT_CREATE_PROBES)
 
@@ -224,9 +230,44 @@ int __tracepoint_registered
        __attribute__((weak, visibility("hidden")));
 int __tracepoint_ptrs_registered
        __attribute__((weak, visibility("hidden")));
-struct tracepoint_dlopen tracepoint_dlopen
+struct lttng_ust_tracepoint_dlopen tracepoint_dlopen
        __attribute__((weak, visibility("hidden")));
 
+#ifndef _LGPL_SOURCE
+static inline void lttng_ust_notrace
+__tracepoint__init_urcu_sym(void);
+static inline void
+__tracepoint__init_urcu_sym(void)
+{
+       /*
+        * Symbols below are needed by tracepoint call sites and probe
+        * providers.
+        */
+       if (!tracepoint_dlopen.rcu_read_lock_sym_bp)
+               tracepoint_dlopen.rcu_read_lock_sym_bp =
+                       URCU_FORCE_CAST(void (*)(void),
+                               dlsym(tracepoint_dlopen.liblttngust_handle,
+                                       "tp_rcu_read_lock_bp"));
+       if (!tracepoint_dlopen.rcu_read_unlock_sym_bp)
+               tracepoint_dlopen.rcu_read_unlock_sym_bp =
+                       URCU_FORCE_CAST(void (*)(void),
+                               dlsym(tracepoint_dlopen.liblttngust_handle,
+                                       "tp_rcu_read_unlock_bp"));
+       if (!tracepoint_dlopen.rcu_dereference_sym_bp)
+               tracepoint_dlopen.rcu_dereference_sym_bp =
+                       URCU_FORCE_CAST(void *(*)(void *p),
+                               dlsym(tracepoint_dlopen.liblttngust_handle,
+                                       "tp_rcu_dereference_sym_bp"));
+}
+#else
+static inline void lttng_ust_notrace
+__tracepoint__init_urcu_sym(void);
+static inline void
+__tracepoint__init_urcu_sym(void)
+{
+}
+#endif
+
 static void lttng_ust_notrace __attribute__((constructor))
 __tracepoints__init(void);
 static void
@@ -240,28 +281,7 @@ __tracepoints__init(void)
                        dlopen("liblttng-ust-tracepoint.so.0", RTLD_NOW | RTLD_GLOBAL);
        if (!tracepoint_dlopen.liblttngust_handle)
                return;
-       tracepoint_dlopen.tracepoint_register_lib =
-               URCU_FORCE_CAST(int (*)(struct tracepoint * const *, int),
-                               dlsym(tracepoint_dlopen.liblttngust_handle,
-                                       "tracepoint_register_lib"));
-       tracepoint_dlopen.tracepoint_unregister_lib =
-               URCU_FORCE_CAST(int (*)(struct tracepoint * const *),
-                               dlsym(tracepoint_dlopen.liblttngust_handle,
-                                       "tracepoint_unregister_lib"));
-#ifndef _LGPL_SOURCE
-       tracepoint_dlopen.rcu_read_lock_sym_bp =
-               URCU_FORCE_CAST(void (*)(void),
-                               dlsym(tracepoint_dlopen.liblttngust_handle,
-                                       "tp_rcu_read_lock_bp"));
-       tracepoint_dlopen.rcu_read_unlock_sym_bp =
-               URCU_FORCE_CAST(void (*)(void),
-                               dlsym(tracepoint_dlopen.liblttngust_handle,
-                                       "tp_rcu_read_unlock_bp"));
-       tracepoint_dlopen.rcu_dereference_sym_bp =
-               URCU_FORCE_CAST(void *(*)(void *p),
-                               dlsym(tracepoint_dlopen.liblttngust_handle,
-                                       "tp_rcu_dereference_sym_bp"));
-#endif
+       __tracepoint__init_urcu_sym();
 }
 
 static void lttng_ust_notrace __attribute__((destructor))
@@ -275,7 +295,10 @@ __tracepoints__destroy(void)
                return;
        if (tracepoint_dlopen.liblttngust_handle && !__tracepoint_ptrs_registered) {
                ret = dlclose(tracepoint_dlopen.liblttngust_handle);
-               assert(!ret);
+               if (ret) {
+                       fprintf(stderr, "Error (%d) in dlclose\n", ret);
+                       abort();
+               }
                memset(&tracepoint_dlopen, 0, sizeof(tracepoint_dlopen));
        }
 }
@@ -289,9 +312,9 @@ __tracepoints__destroy(void)
  * registering only _one_ instance of the tracepoints per shared-ojbect
  * (or for the whole main program).
  */
-extern struct tracepoint * const __start___tracepoints_ptrs[]
+extern struct lttng_ust_tracepoint * const __start___tracepoints_ptrs[]
        __attribute__((weak, visibility("hidden")));
-extern struct tracepoint * const __stop___tracepoints_ptrs[]
+extern struct lttng_ust_tracepoint * const __stop___tracepoints_ptrs[]
        __attribute__((weak, visibility("hidden")));
 
 /*
@@ -321,7 +344,7 @@ extern struct tracepoint * const __stop___tracepoints_ptrs[]
        static const char __tp_strtab_##_provider##___##_name[]                 \
                __attribute__((section("__tracepoints_strings"))) =             \
                        #_provider ":" #_name;                                  \
-       struct tracepoint __tracepoint_##_provider##___##_name                  \
+       struct lttng_ust_tracepoint __tracepoint_##_provider##___##_name        \
                __attribute__((section("__tracepoints"))) =                     \
                {                                                               \
                        __tp_strtab_##_provider##___##_name,                    \
@@ -329,8 +352,10 @@ extern struct tracepoint * const __stop___tracepoints_ptrs[]
                        NULL,                                                   \
                        _TRACEPOINT_UNDEFINED_REF(_provider),                   \
                        _TP_EXTRACT_STRING(_args),                              \
+                       { },                                                    \
                };                                                              \
-       static struct tracepoint * __tracepoint_ptr_##_provider##___##_name     \
+       static struct lttng_ust_tracepoint *                                    \
+               __tracepoint_ptr_##_provider##___##_name                        \
                __attribute__((used, section("__tracepoints_ptrs"))) =          \
                        &__tracepoint_##_provider##___##_name;
 
@@ -346,9 +371,20 @@ __tracepoints__ptrs_init(void)
                        dlopen("liblttng-ust-tracepoint.so.0", RTLD_NOW | RTLD_GLOBAL);
        if (!tracepoint_dlopen.liblttngust_handle)
                return;
-       tracepoint_dlopen.tracepoint_register_lib(__start___tracepoints_ptrs,
+       tracepoint_dlopen.tracepoint_register_lib =
+               URCU_FORCE_CAST(int (*)(struct lttng_ust_tracepoint * const *, int),
+                               dlsym(tracepoint_dlopen.liblttngust_handle,
+                                       "tracepoint_register_lib"));
+       tracepoint_dlopen.tracepoint_unregister_lib =
+               URCU_FORCE_CAST(int (*)(struct lttng_ust_tracepoint * const *),
+                               dlsym(tracepoint_dlopen.liblttngust_handle,
+                                       "tracepoint_unregister_lib"));
+       __tracepoint__init_urcu_sym();
+       if (tracepoint_dlopen.tracepoint_register_lib) {
+               tracepoint_dlopen.tracepoint_register_lib(__start___tracepoints_ptrs,
                                __stop___tracepoints_ptrs -
                                __start___tracepoints_ptrs);
+       }
 }
 
 static void lttng_ust_notrace __attribute__((destructor))
@@ -364,7 +400,10 @@ __tracepoints__ptrs_destroy(void)
                tracepoint_dlopen.tracepoint_unregister_lib(__start___tracepoints_ptrs);
        if (tracepoint_dlopen.liblttngust_handle && !__tracepoint_registered) {
                ret = dlclose(tracepoint_dlopen.liblttngust_handle);
-               assert(!ret);
+               if (ret) {
+                       fprintf(stderr, "Error (%d) in dlclose\n", ret);
+                       abort();
+               }
                memset(&tracepoint_dlopen, 0, sizeof(tracepoint_dlopen));
        }
 }
@@ -533,7 +572,7 @@ __tracepoints__ptrs_destroy(void)
  * debug information with line-level scope (TRACEPOINT_EVENT default)
  *
  * TRACE_DEBUG           14
- * debug-level message (trace_printf default)
+ * debug-level message
  *
  * Declare tracepoint loglevels for tracepoints. A TRACEPOINT_EVENT
  * should be declared prior to the the TRACEPOINT_LOGLEVEL for a given
This page took 0.026146 seconds and 4 git commands to generate.