--- /dev/null
+#ifndef _LTTNG_TRACEPOINT_RCU_H
+#define _LTTNG_TRACEPOINT_RCU_H
+
+/*
+ * Copyright (c) 2011 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program
+ * for any purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ * This file allows weak linking on tracepoint RCU symbols for non-LGPL
+ * code.
+ */
+
+#include <urcu/compiler.h>
+
+#ifdef _LGPL_SOURCE
+
+#include <urcu-bp.h>
+
+#define TP_RCU_LINK_TEST() 1
+#define tp_rcu_read_lock_bp rcu_read_lock_bp
+#define tp_rcu_read_unlock_bp rcu_read_unlock_bp
+#define tp_rcu_dereference_bp rcu_dereference_bp
+
+#else /* _LGPL_SOURCE */
+
+#define TP_RCU_LINK_TEST() tp_rcu_read_lock_bp
+
+/* Symbols looked up with dlsym */
+static void (*tp_rcu_read_lock_bp)(void) __attribute__((unused));
+static void (*tp_rcu_read_unlock_bp)(void) __attribute__((unused));
+static void *(*tp_rcu_dereference_sym_bp)(void *p) __attribute__((unused));
+
+#define tp_rcu_dereference_bp(p) \
+ ({ \
+ typeof(p) _________p1 = URCU_FORCE_CAST(typeof(p), \
+ tp_rcu_dereference_sym_bp(URCU_FORCE_CAST(void *, p))); \
+ (_________p1); \
+ })
+
+#endif /* _LGPL_SOURCE */
+
+#endif /* _LTTNG_TRACEPOINT_RCU_H */
* modified is included with the above copyright notice.
*/
-#include <urcu-bp.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" {
#define _TP_ARGS_DATA_VAR(...) _TP_DATA_VAR_N(_TP_NARGS(0, ##__VA_ARGS__), ##__VA_ARGS__)
#define _TP_PARAMS(...) __VA_ARGS__
-#ifdef _LGPL_SOURCE
-#define _TP_RCU_LINK_TEST() 1
-#else
-#define _TP_RCU_LINK_TEST() rcu_read_lock_bp
-#endif
-
#define _DECLARE_TRACEPOINT(provider, name, ...) \
extern struct tracepoint __tracepoint_##provider##___##name; \
static inline void __tracepoint_cb_##provider##___##name(_TP_ARGS_PROTO(__VA_ARGS__)) \
{ \
struct tracepoint_probe *__tp_probe; \
\
- if (!_TP_RCU_LINK_TEST()) \
+ 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 { \
(_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) \
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);