#include <ust/kcompat/kcompat.h>
#include <urcu-bp.h>
#include <urcu/hlist.h>
+#include <urcu/uatomic.h>
-#include "usterr_signal_safe.h"
-
-extern struct tracepoint * const __start___tracepoints_ptrs[]
- __attribute__((visibility("hidden")));
-extern struct tracepoint * const __stop___tracepoints_ptrs[]
- __attribute__((visibility("hidden")));
-
-static struct tracepoint * __tracepoint_ptr_dummy
- __attribute__((used, section("__tracepoints_ptrs")));
+#include <ust/usterr-signal-safe.h>
/* Set to 1 to enable tracepoint debug output */
static const int tracepoint_debug;
{
struct tracepoint_lib *pl, *iter;
+ init_tracepoint();
+
pl = (struct tracepoint_lib *) zmalloc(sizeof(struct tracepoint_lib));
pl->tracepoints_start = tracepoints_start;
/* TODO: update just the loaded lib */
lib_update_tracepoints();
- /* tracepoints_count - 1: skip dummy */
- DBG("just registered a tracepoints section from %p and having %d tracepoints (minus dummy tracepoints)", tracepoints_start, tracepoints_count);
+ DBG("just registered a tracepoints section from %p and having %d tracepoints",
+ tracepoints_start, tracepoints_count);
return 0;
}
return 0;
}
-void __attribute__((constructor)) init_tracepoint(void)
+void init_tracepoint(void)
{
+ if (uatomic_xchg(&initialized, 1) == 1)
+ return;
init_usterr();
- if (!initialized) {
- tracepoint_register_lib(__start___tracepoints_ptrs,
- __stop___tracepoints_ptrs
- - __start___tracepoints_ptrs);
- initialized = 1;
- }
}
-void __attribute__((destructor)) destroy_tracepoint(void)
+void exit_tracepoint(void)
{
- tracepoint_unregister_lib(__start___tracepoints_ptrs);
}