Cygwin: Fix multiple loaded instances of liblttng-ust-tracepoint due to dlopen
[lttng-ust.git] / include / lttng / tracepoint.h
index 4b773bbc2eead7a60e11415ead1d364e979afa6d..7d714db84a67b73f56c183a48770be2f776a1586 100644 (file)
@@ -62,8 +62,12 @@ extern "C" {
 #define _TP_COMBINE_TOKENS4(_tokena, _tokenb, _tokenc, _tokend)                \
                __TP_COMBINE_TOKENS4(_tokena, _tokenb, _tokenc, _tokend)
 
-/* _TP_EXVAR* extract the var names. */
+/*
+ * _TP_EXVAR* extract the var names.
+ * _TP_EXVAR1 and _TP_EXDATA_VAR1 are needed for -std=c99.
+ */
 #define _TP_EXVAR0()
+#define _TP_EXVAR1(a)
 #define _TP_EXVAR2(a,b)                                                b
 #define _TP_EXVAR4(a,b,c,d)                                    b,d
 #define _TP_EXVAR6(a,b,c,d,e,f)                                        b,d,f
@@ -76,6 +80,7 @@ extern "C" {
 #define _TP_EXVAR20(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t)   b,d,f,h,j,l,n,p,r,t
 
 #define _TP_EXDATA_VAR0()                                              __tp_data
+#define _TP_EXDATA_VAR1(a)                                             __tp_data
 #define _TP_EXDATA_VAR2(a,b)                                           __tp_data,b
 #define _TP_EXDATA_VAR4(a,b,c,d)                                       __tp_data,b,d
 #define _TP_EXDATA_VAR6(a,b,c,d,e,f)                                   __tp_data,b,d,f
@@ -87,8 +92,12 @@ extern "C" {
 #define _TP_EXDATA_VAR18(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r)          __tp_data,b,d,f,h,j,l,n,p,r
 #define _TP_EXDATA_VAR20(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t)      __tp_data,b,d,f,h,j,l,n,p,r,t
 
-/* _TP_EXPROTO* extract tuples of type, var */
-#define _TP_EXPROTO0()
+/*
+ * _TP_EXPROTO* extract tuples of type, var.
+ * _TP_EXPROTO1 and _TP_EXDATA_PROTO1 are needed for -std=c99.
+ */
+#define _TP_EXPROTO0()                                         void
+#define _TP_EXPROTO1(a)                                                void
 #define _TP_EXPROTO2(a,b)                                      a b
 #define _TP_EXPROTO4(a,b,c,d)                                  a b,c d
 #define _TP_EXPROTO6(a,b,c,d,e,f)                              a b,c d,e f
@@ -101,6 +110,7 @@ extern "C" {
 #define _TP_EXPROTO20(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t) a b,c d,e f,g h,i j,k l,m n,o p,q r,s t
 
 #define _TP_EXDATA_PROTO0()                                            void *__tp_data
+#define _TP_EXDATA_PROTO1(a)                                           void *__tp_data
 #define _TP_EXDATA_PROTO2(a,b)                                         void *__tp_data,a b
 #define _TP_EXDATA_PROTO4(a,b,c,d)                                     void *__tp_data,a b,c d
 #define _TP_EXDATA_PROTO6(a,b,c,d,e,f)                                 void *__tp_data,a b,c d,e f
@@ -138,7 +148,7 @@ static inline void __tracepoint_cb_##_provider##___##_name(_TP_ARGS_PROTO(__VA_A
        if (caa_unlikely(!__tp_probe))                                                  \
                goto end;                                                               \
        do {                                                                            \
-               void *__tp_cb = __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)    \
@@ -148,20 +158,21 @@ end:                                                                                      \
        tp_rcu_read_unlock_bp();                                                        \
 }                                                                                      \
 static inline void __tracepoint_register_##_provider##___##_name(char *name,           \
-               void *func, void *data)                                                 \
+               void (*func)(void), void *data)                                                 \
 {                                                                                      \
        __tracepoint_probe_register(name, func, data,                                   \
                __tracepoint_##_provider##___##_name.signature);                        \
 }                                                                                      \
 static inline void __tracepoint_unregister_##_provider##___##_name(char *name,         \
-               void *func, void *data)                                                 \
+               void (*func)(void), void *data)                                                 \
 {                                                                                      \
        __tracepoint_probe_unregister(name, func, data);                                \
 }
 
-extern int __tracepoint_probe_register(const char *name, void *func, void *data,
-               const char *signature);
-extern int __tracepoint_probe_unregister(const char *name, void *func, void *data);
+extern int __tracepoint_probe_register(const char *name, void (*func)(void),
+               void *data, const char *signature);
+extern int __tracepoint_probe_unregister(const char *name, void (*func)(void),
+               void *data);
 
 /*
  * tracepoint dynamic linkage handling (callbacks). Hidden visibility:
@@ -224,49 +235,40 @@ extern struct tracepoint_dlopen tracepoint_dlopen;
                __attribute__((used, section("__tracepoints_ptrs"))) =          \
                        &__tracepoint_##_provider##___##_name;
 
-/*
- * These weak symbols, the constructor, and destructor take care of
- * registering only _one_ instance of the tracepoints per shared-ojbect
- * (or for the whole main program).
- */
 extern struct tracepoint * const __start___tracepoints_ptrs[]
-       __attribute__((weak, visibility("hidden")));
+       __attribute__((visibility("hidden")));
 extern struct tracepoint * const __stop___tracepoints_ptrs[]
-       __attribute__((weak, visibility("hidden")));
+       __attribute__((visibility("hidden")));
 int __tracepoint_registered
-       __attribute__((weak, visibility("hidden")));
+       __attribute__((visibility("hidden")));
 struct tracepoint_dlopen tracepoint_dlopen
-       __attribute__((weak, visibility("hidden")));
+       __attribute__((visibility("hidden")));
 
 static void __attribute__((constructor)) __tracepoints__init(void)
 {
        if (__tracepoint_registered++)
                return;
 
-       tracepoint_dlopen.liblttngust_handle =
-               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,
+                               dlsym(RTLD_DEFAULT,
                                        "tracepoint_register_lib"));
        tracepoint_dlopen.tracepoint_unregister_lib =
                URCU_FORCE_CAST(int (*)(struct tracepoint * const *),
-                               dlsym(tracepoint_dlopen.liblttngust_handle,
+                               dlsym(RTLD_DEFAULT,
                                        "tracepoint_unregister_lib"));
 #ifndef _LGPL_SOURCE
        tracepoint_dlopen.rcu_read_lock_sym_bp =
                URCU_FORCE_CAST(void (*)(void),
-                               dlsym(tracepoint_dlopen.liblttngust_handle,
+                               dlsym(RTLD_DEFAULT,
                                        "tp_rcu_read_lock_bp"));
        tracepoint_dlopen.rcu_read_unlock_sym_bp =
                URCU_FORCE_CAST(void (*)(void),
-                               dlsym(tracepoint_dlopen.liblttngust_handle,
+                               dlsym(RTLD_DEFAULT,
                                        "tp_rcu_read_unlock_bp"));
        tracepoint_dlopen.rcu_dereference_sym_bp =
                URCU_FORCE_CAST(void *(*)(void *p),
-                               dlsym(tracepoint_dlopen.liblttngust_handle,
+                               dlsym(RTLD_DEFAULT,
                                        "tp_rcu_dereference_sym_bp"));
 #endif
        tracepoint_dlopen.tracepoint_register_lib(__start___tracepoints_ptrs,
This page took 0.02621 seconds and 4 git commands to generate.