Fix dynamic linking with GNU gold linker
[lttng-ust.git] / include / lttng / tracepoint.h
index 831447dd64643dc754ec0aa6ad9cd39a12ce7d36..2942c175e7cf0580ecf39edd99b78a1eb47d9c9c 100644 (file)
  * modified is included with the above copyright notice.
  */
 
-#include <urcu-bp.h>
-#include <tracepoint-types.h>
+#include <lttng/tracepoint-types.h>
+#include <lttng/tracepoint-rcu.h>
 #include <urcu/compiler.h>
 #include <dlfcn.h>     /* for dlopen */
+#include <assert.h>
 
 #ifdef __cplusplus
 extern "C" {
@@ -37,8 +38,18 @@ extern "C" {
  * fine too).
  * Each tuple is also separated by a comma.
  */
-#define _TP_COMBINE_TOKENS1(_tokena, _tokenb)       _tokena##_tokenb
-#define _TP_COMBINE_TOKENS(_tokena, _tokenb)        _TP_COMBINE_TOKENS1(_tokena, _tokenb)
+#define __TP_COMBINE_TOKENS(_tokena, _tokenb)                          \
+               _tokena##_tokenb
+#define _TP_COMBINE_TOKENS(_tokena, _tokenb)                           \
+               __TP_COMBINE_TOKENS(_tokena, _tokenb)
+#define __TP_COMBINE_TOKENS3(_tokena, _tokenb, _tokenc)                        \
+               _tokena##_tokenb##_tokenc
+#define _TP_COMBINE_TOKENS3(_tokena, _tokenb, _tokenc)                 \
+               __TP_COMBINE_TOKENS3(_tokena, _tokenb, _tokenc)
+#define __TP_COMBINE_TOKENS4(_tokena, _tokenb, _tokenc, _tokend)       \
+               _tokena##_tokenb##_tokenc##_tokend
+#define _TP_COMBINE_TOKENS4(_tokena, _tokenb, _tokenc, _tokend)                \
+               __TP_COMBINE_TOKENS4(_tokena, _tokenb, _tokenc, _tokend)
 
 /* _TP_EXVAR* extract the var names. */
 #define _TP_EXVAR0()
@@ -109,10 +120,10 @@ static inline void __tracepoint_cb_##provider##___##name(_TP_ARGS_PROTO(__VA_ARG
 {                                                                                      \
        struct tracepoint_probe *__tp_probe;                                            \
                                                                                        \
-       if (!rcu_read_lock_bp)                                                          \
+       if (!TP_RCU_LINK_TEST())                                                        \
                return;                                                                 \
-       rcu_read_lock_bp();                                                             \
-       __tp_probe = rcu_dereference_bp(__tracepoint_##provider##___##name.probes);     \
+       tp_rcu_read_lock_bp();                                                          \
+       __tp_probe = tp_rcu_dereference_bp(__tracepoint_##provider##___##name.probes);  \
        if (caa_unlikely(!__tp_probe))                                                  \
                goto end;                                                               \
        do {                                                                            \
@@ -123,7 +134,7 @@ static inline void __tracepoint_cb_##provider##___##name(_TP_ARGS_PROTO(__VA_ARG
                                (_TP_ARGS_DATA_VAR(__VA_ARGS__));                       \
        } while ((++__tp_probe)->func);                                                 \
 end:                                                                                   \
-       rcu_read_unlock_bp();                                                           \
+       tp_rcu_read_unlock_bp();                                                        \
 }                                                                                      \
 static inline void __tracepoint_register_##provider##___##name(char *name,             \
                void *func, void *data)                                                 \
@@ -182,10 +193,28 @@ static void __attribute__((constructor)) __tracepoints__init(void)
        liblttngust_handle = dlopen("liblttng-ust.so", RTLD_NOW | RTLD_GLOBAL);
        if (!liblttngust_handle)
                return;
-       tracepoint_register_lib = dlsym(liblttngust_handle,
-                                       "tracepoint_register_lib");
-       tracepoint_unregister_lib = dlsym(liblttngust_handle,
-                                       "tracepoint_unregister_lib");
+       tracepoint_register_lib =
+               URCU_FORCE_CAST(int (*)(struct tracepoint * const *, int),
+                               dlsym(liblttngust_handle,
+                                       "tracepoint_register_lib"));
+       tracepoint_unregister_lib =
+               URCU_FORCE_CAST(int (*)(struct tracepoint * const *),
+                               dlsym(liblttngust_handle,
+                                       "tracepoint_unregister_lib"));
+#ifndef _LGPL_SOURCE
+       tp_rcu_read_lock_bp =
+               URCU_FORCE_CAST(void (*)(void),
+                               dlsym(liblttngust_handle,
+                                       "tp_rcu_read_lock_bp"));
+       tp_rcu_read_unlock_bp =
+               URCU_FORCE_CAST(void (*)(void),
+                               dlsym(liblttngust_handle,
+                                       "tp_rcu_read_unlock_bp"));
+       tp_rcu_dereference_sym_bp =
+               URCU_FORCE_CAST(void *(*)(void *p),
+                               dlsym(liblttngust_handle,
+                                       "tp_rcu_dereference_sym_bp"));
+#endif
        tracepoint_register_lib(__start___tracepoints_ptrs,
                                __stop___tracepoints_ptrs -
                                __start___tracepoints_ptrs);
This page took 0.023911 seconds and 4 git commands to generate.