tracepoint: namespace systemtap UST macros with LTTNG_UST_ prefix
[lttng-ust.git] / include / lttng / tracepoint.h
index 51eafdeb5a4cce36e957ede0d5af31557fb5d803..b47b1e0e1c00ab5eb5d1a79356762b8852b35874 100644 (file)
@@ -1,28 +1,12 @@
-#ifndef _LTTNG_TRACEPOINT_H
-#define _LTTNG_TRACEPOINT_H
-
 /*
- * Copyright 2011-2012 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
+ * SPDX-License-Identifier: MIT
+ *
+ * Copyright (C) 2011-2012 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
  */
 
+#ifndef _LTTNG_TRACEPOINT_H
+#define _LTTNG_TRACEPOINT_H
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <lttng/tracepoint-types.h>
 #include <urcu/system.h>
 #include <dlfcn.h>     /* for dlopen */
 #include <string.h>    /* for memset */
+
 #include <lttng/ust-config.h>  /* for sdt */
 #include <lttng/ust-compiler.h>
+#include <lttng/ust-tracer.h>
 
 #ifdef LTTNG_UST_HAVE_SDT_INTEGRATION
 /*
  */
 #include <sys/sdt.h>
 
-#define _LTTNG_SDT_NARG(...) \
-       __LTTNG_SDT_NARG(__VA_ARGS__, 12,11,10,9,8,7,6,5,4,3,2,1,0)
+#define _LTTNG_UST_SDT_NARG(...) \
+       __LTTNG_UST_SDT_NARG(__VA_ARGS__, 12,11,10,9,8,7,6,5,4,3,2,1,0)
 
-#define __LTTNG_SDT_NARG(_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12, N, ...) N
+#define __LTTNG_UST_SDT_NARG(_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12, N, ...) N
 
-#define _LTTNG_SDT_PROBE_N(provider, name, N, ...) \
+#define _LTTNG_UST_SDT_PROBE_N(provider, name, N, ...) \
        _SDT_PROBE(provider, name, N, (__VA_ARGS__))
 
-#define LTTNG_STAP_PROBEV(provider, name, ...) \
-       _LTTNG_SDT_PROBE_N(provider, name, _LTTNG_SDT_NARG(0, ##__VA_ARGS__), ##__VA_ARGS__)
+#define LTTNG_UST_STAP_PROBEV(provider, name, ...) \
+       _LTTNG_UST_SDT_PROBE_N(provider, name, _LTTNG_UST_SDT_NARG(0, ##__VA_ARGS__), ##__VA_ARGS__)
 
 #else
-#define LTTNG_STAP_PROBEV(...)
+#define LTTNG_UST_STAP_PROBEV(...)
 #endif
 
 #ifdef __cplusplus
@@ -69,7 +55,7 @@ extern "C" {
 
 #define tracepoint(provider, name, ...)                                            \
        do {                                                                \
-               LTTNG_STAP_PROBEV(provider, name, ## __VA_ARGS__);          \
+               LTTNG_UST_STAP_PROBEV(provider, name, ## __VA_ARGS__);      \
                if (tracepoint_enabled(provider, name))                     \
                        do_tracepoint(provider, name, __VA_ARGS__);         \
        } while (0)
@@ -175,8 +161,9 @@ extern "C" {
  */
 #define _DECLARE_TRACEPOINT(_provider, _name, ...)                                     \
 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                                                                          \
+void __tracepoint_cb_##_provider##___##_name(_TP_ARGS_PROTO(__VA_ARGS__))              \
+       __attribute__((always_inline, unused)) lttng_ust_notrace;                       \
 static                                                                                 \
 void __tracepoint_cb_##_provider##___##_name(_TP_ARGS_PROTO(__VA_ARGS__))              \
 {                                                                                      \
@@ -198,9 +185,10 @@ void __tracepoint_cb_##_provider##___##_name(_TP_ARGS_PROTO(__VA_ARGS__))          \
 end:                                                                                   \
        tp_rcu_read_unlock();                                                           \
 }                                                                                      \
-static inline lttng_ust_notrace                                                                \
+static inline                                                                          \
 void __tracepoint_register_##_provider##___##_name(char *name,                         \
-               void (*func)(void), void *data);                                        \
+               void (*func)(void), void *data)                                         \
+       lttng_ust_notrace;                                                              \
 static inline                                                                          \
 void __tracepoint_register_##_provider##___##_name(char *name,                         \
                void (*func)(void), void *data)                                         \
@@ -208,9 +196,10 @@ void __tracepoint_register_##_provider##___##_name(char *name,                             \
        __tracepoint_probe_register(name, func, data,                                   \
                __tracepoint_##_provider##___##_name.signature);                        \
 }                                                                                      \
-static inline lttng_ust_notrace                                                                \
+static inline                                                                          \
 void __tracepoint_unregister_##_provider##___##_name(char *name,                       \
-               void (*func)(void), void *data);                                        \
+               void (*func)(void), void *data)                                         \
+       lttng_ust_notrace;                                                              \
 static inline                                                                          \
 void __tracepoint_unregister_##_provider##___##_name(char *name,                       \
                void (*func)(void), void *data)                                         \
@@ -226,8 +215,18 @@ 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.
+ *
+ * IMPORTANT: this structure is part of the ABI between instrumented
+ * applications and UST. Fields need to be only added at the end, never
+ * reordered, never removed.
+ *
+ * The field @struct_size should be used to determine the size of the
+ * structure. It should be queried before using additional fields added
+ * at the end of the structure.
  */
 struct lttng_ust_tracepoint_dlopen {
+       uint32_t struct_size;
+
        void *liblttngust_handle;
 
        int (*tracepoint_register_lib)(struct lttng_ust_tracepoint * const *tracepoints_start,
@@ -236,6 +235,8 @@ struct lttng_ust_tracepoint_dlopen {
        void (*rcu_read_lock_sym)(void);
        void (*rcu_read_unlock_sym)(void);
        void *(*rcu_dereference_sym)(void *p);
+
+       /* End of base ABI. Fields below should be used after checking struct_size. */
 };
 
 extern struct lttng_ust_tracepoint_dlopen tracepoint_dlopen;
@@ -251,7 +252,9 @@ int __tracepoint_registered
 int __tracepoint_ptrs_registered
        __attribute__((weak, visibility("hidden")));
 struct lttng_ust_tracepoint_dlopen tracepoint_dlopen
-       __attribute__((weak, visibility("hidden")));
+               __attribute__((weak, visibility("hidden"))) = {
+       .struct_size = sizeof(struct lttng_ust_tracepoint_dlopen),
+};
 /*
  * Deal with gcc O1 optimisation issues with weak hidden symbols. gcc
  * 4.8 and prior does not have the same behavior for symbol scoping on
@@ -269,18 +272,31 @@ struct lttng_ust_tracepoint_dlopen *tracepoint_dlopen_ptr
  * Tracepoint dynamic linkage handling (callbacks). Hidden visibility: shared
  * across objects in a module/main executable. The callbacks are used to
  * control and check if the destructors should be executed.
+ *
+ * IMPORTANT: this structure is part of the ABI between instrumented
+ * applications and UST. Fields need to be only added at the end, never
+ * reordered, never removed.
+ *
+ * The field @struct_size should be used to determine the size of the
+ * structure. It should be queried before using additional fields added
+ * at the end of the structure.
  */
 struct lttng_ust_tracepoint_destructors_syms {
-       int *old_tracepoint_disable_destructors;
+       uint32_t struct_size;
+
        void (*tracepoint_disable_destructors)(void);
        int (*tracepoint_get_destructors_state)(void);
+
+       /* End of base ABI. Fields below should be used after checking struct_size. */
 };
 
 extern struct lttng_ust_tracepoint_destructors_syms tracepoint_destructors_syms;
 extern struct lttng_ust_tracepoint_destructors_syms *tracepoint_destructors_syms_ptr;
 
 struct lttng_ust_tracepoint_destructors_syms tracepoint_destructors_syms
-       __attribute__((weak, visibility("hidden")));
+       __attribute__((weak, visibility("hidden"))) = {
+       .struct_size = sizeof(struct lttng_ust_tracepoint_destructors_syms),
+};
 struct lttng_ust_tracepoint_destructors_syms *tracepoint_destructors_syms_ptr
        __attribute__((weak, visibility("hidden")));
 
@@ -293,12 +309,12 @@ static inline void tracepoint_disable_destructors(void)
        if (tracepoint_dlopen_ptr->liblttngust_handle
                        && tracepoint_destructors_syms_ptr->tracepoint_disable_destructors)
                tracepoint_destructors_syms_ptr->tracepoint_disable_destructors();
-       *tracepoint_destructors_syms_ptr->old_tracepoint_disable_destructors = 1;
 }
 
 #ifndef _LGPL_SOURCE
-static inline void lttng_ust_notrace
-__tracepoint__init_urcu_sym(void);
+static inline void
+__tracepoint__init_urcu_sym(void)
+       lttng_ust_notrace;
 static inline void
 __tracepoint__init_urcu_sym(void)
 {
@@ -325,16 +341,18 @@ __tracepoint__init_urcu_sym(void)
                                        "tp_rcu_dereference_sym"));
 }
 #else
-static inline void lttng_ust_notrace
-__tracepoint__init_urcu_sym(void);
+static inline void
+__tracepoint__init_urcu_sym(void)
+       lttng_ust_notrace;
 static inline void
 __tracepoint__init_urcu_sym(void)
 {
 }
 #endif
 
-static void lttng_ust_notrace __attribute__((constructor))
-__tracepoints__init(void);
+static void
+__tracepoints__init(void)
+       lttng_ust_notrace __attribute__((constructor));
 static void
 __tracepoints__init(void)
 {
@@ -349,14 +367,15 @@ __tracepoints__init(void)
                tracepoint_dlopen_ptr = &tracepoint_dlopen;
        if (!tracepoint_dlopen_ptr->liblttngust_handle)
                tracepoint_dlopen_ptr->liblttngust_handle =
-                       dlopen("liblttng-ust-tracepoint.so.1", RTLD_NOW | RTLD_GLOBAL);
+                       dlopen(LTTNG_UST_TRACEPOINT_LIB_SONAME, RTLD_NOW | RTLD_GLOBAL);
        if (!tracepoint_dlopen_ptr->liblttngust_handle)
                return;
        __tracepoint__init_urcu_sym();
 }
 
-static void lttng_ust_notrace __attribute__((destructor))
-__tracepoints__destroy(void);
+static void
+__tracepoints__destroy(void)
+       lttng_ust_notrace __attribute__((destructor));
 static void
 __tracepoints__destroy(void)
 {
@@ -384,19 +403,6 @@ __tracepoints__destroy(void)
                 */
                return;
        }
-       /*
-        * Lookup if destructors must be executed using the old method.
-        */
-       if (tracepoint_destructors_syms_ptr->old_tracepoint_disable_destructors
-               && *tracepoint_destructors_syms_ptr->old_tracepoint_disable_destructors) {
-               /*
-                * The old_tracepoint_disable_destructors symbol was found with
-                * dlsym but its value is 1 meaning that destructors must not
-                * be executed.
-                */
-               return;
-       }
-
        ret = dlclose(tracepoint_dlopen_ptr->liblttngust_handle);
        if (ret) {
                fprintf(stderr, "Error (%d) in dlclose\n", ret);
@@ -445,14 +451,13 @@ extern struct lttng_ust_tracepoint * const __stop___tracepoints_ptrs[]
                __attribute__((section("__tracepoints_strings"))) =             \
                        #_provider ":" #_name;                                  \
        struct lttng_ust_tracepoint __tracepoint_##_provider##___##_name        \
-               __attribute__((section("__tracepoints"))) =                     \
-               {                                                               \
+               __attribute__((section("__tracepoints"))) = {                   \
+                       sizeof(struct lttng_ust_tracepoint),                    \
                        __tp_strtab_##_provider##___##_name,                    \
                        0,                                                      \
                        NULL,                                                   \
                        _TRACEPOINT_UNDEFINED_REF(_provider),                   \
                        _TP_EXTRACT_STRING(_args),                              \
-                       { },                                                    \
                };                                                              \
        static struct lttng_ust_tracepoint *                                    \
                __tracepoint_ptr_##_provider##___##_name                        \
@@ -460,8 +465,9 @@ extern struct lttng_ust_tracepoint * const __stop___tracepoints_ptrs[]
                __lttng_ust_variable_attribute_no_sanitize_address =            \
                        &__tracepoint_##_provider##___##_name;
 
-static void lttng_ust_notrace __attribute__((constructor))
-__tracepoints__ptrs_init(void);
+static void
+__tracepoints__ptrs_init(void)
+       lttng_ust_notrace __attribute__((constructor));
 static void
 __tracepoints__ptrs_init(void)
 {
@@ -471,7 +477,7 @@ __tracepoints__ptrs_init(void)
                tracepoint_dlopen_ptr = &tracepoint_dlopen;
        if (!tracepoint_dlopen_ptr->liblttngust_handle)
                tracepoint_dlopen_ptr->liblttngust_handle =
-                       dlopen("liblttng-ust-tracepoint.so.1", RTLD_NOW | RTLD_GLOBAL);
+                       dlopen(LTTNG_UST_TRACEPOINT_LIB_SONAME, RTLD_NOW | RTLD_GLOBAL);
        if (!tracepoint_dlopen_ptr->liblttngust_handle)
                return;
        if (!tracepoint_destructors_syms_ptr)
@@ -479,15 +485,11 @@ __tracepoints__ptrs_init(void)
        tracepoint_dlopen_ptr->tracepoint_register_lib =
                URCU_FORCE_CAST(int (*)(struct lttng_ust_tracepoint * const *, int),
                                dlsym(tracepoint_dlopen_ptr->liblttngust_handle,
-                                       "tracepoint_register_lib2"));
+                                       "tracepoint_register_lib"));
        tracepoint_dlopen_ptr->tracepoint_unregister_lib =
                URCU_FORCE_CAST(int (*)(struct lttng_ust_tracepoint * const *),
                                dlsym(tracepoint_dlopen_ptr->liblttngust_handle,
-                                       "tracepoint_unregister_lib2"));
-       tracepoint_destructors_syms_ptr->old_tracepoint_disable_destructors =
-               URCU_FORCE_CAST(int *,
-                               dlsym(tracepoint_dlopen_ptr->liblttngust_handle,
-                                       "__tracepoints__disable_destructors"));
+                                       "tracepoint_unregister_lib"));
        tracepoint_destructors_syms_ptr->tracepoint_disable_destructors =
                URCU_FORCE_CAST(void (*)(void),
                                dlsym(tracepoint_dlopen_ptr->liblttngust_handle,
@@ -504,8 +506,9 @@ __tracepoints__ptrs_init(void)
        }
 }
 
-static void lttng_ust_notrace __attribute__((destructor))
-__tracepoints__ptrs_destroy(void);
+static void
+__tracepoints__ptrs_destroy(void)
+       lttng_ust_notrace __attribute__((destructor));
 static void
 __tracepoints__ptrs_destroy(void)
 {
This page took 0.029845 seconds and 4 git commands to generate.