X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=include%2Flttng%2Ftracepoint.h;h=ed20594497ab65bab366b594bb965e740d3e9b29;hb=664ccf245fcb343e1ea10e145bab3749423e9d0f;hp=16348b86106c98e15abe58cf62b8fc11cdc43a4c;hpb=ea960c20b5d55ac004fda761ed53aaba2de4cdc3;p=lttng-ust.git 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);