From 664ccf245fcb343e1ea10e145bab3749423e9d0f Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Thu, 10 Mar 2016 09:32:59 -0500 Subject: [PATCH] Add tracepoint_disable_destructors() Calling this function from an instrumented program allows disabling tracepoint destructors. This allows threads to continue calling tracepoint code even after the tracepoint destructors have run. This is needed for applications that exit without joining all their threads. Signed-off-by: Mathieu Desnoyers CC: Jeffrey Chen --- include/lttng/tracepoint.h | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/include/lttng/tracepoint.h b/include/lttng/tracepoint.h index 16348b86..ed205944 100644 --- a/include/lttng/tracepoint.h +++ b/include/lttng/tracepoint.h @@ -227,6 +227,21 @@ struct lttng_ust_tracepoint_dlopen { extern struct lttng_ust_tracepoint_dlopen tracepoint_dlopen; +/* Disable tracepoint destructors. */ +int __tracepoints__disable_destructors __attribute__((weak)); + +/* + * Programs that have threads that survive after they exit, and + * therefore call library destructors, should disable the tracepoint + * destructors by calling tracepoint_disable_destructors(). This will + * leak the tracepoint instrumentation library shared object, leaving + * its teardown to the operating system process teardown. + */ +static inline void tracepoint_disable_destructors(void) +{ + __tracepoints__disable_destructors = 1; +} + #if defined(TRACEPOINT_DEFINE) || defined(TRACEPOINT_CREATE_PROBES) /* @@ -301,7 +316,9 @@ __tracepoints__destroy(void) if (--__tracepoint_registered) return; - if (tracepoint_dlopen.liblttngust_handle && !__tracepoint_ptrs_registered) { + if (!__tracepoints__disable_destructors + && tracepoint_dlopen.liblttngust_handle + && !__tracepoint_ptrs_registered) { ret = dlclose(tracepoint_dlopen.liblttngust_handle); if (ret) { fprintf(stderr, "Error (%d) in dlclose\n", ret); @@ -406,7 +423,9 @@ __tracepoints__ptrs_destroy(void) return; if (tracepoint_dlopen.tracepoint_unregister_lib) tracepoint_dlopen.tracepoint_unregister_lib(__start___tracepoints_ptrs); - if (tracepoint_dlopen.liblttngust_handle && !__tracepoint_registered) { + if (!__tracepoints__disable_destructors + && tracepoint_dlopen.liblttngust_handle + && !__tracepoint_ptrs_registered) { ret = dlclose(tracepoint_dlopen.liblttngust_handle); if (ret) { fprintf(stderr, "Error (%d) in dlclose\n", ret); -- 2.34.1