X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=include%2Flttng%2Ftracepoint.h;h=cf3519cd25739aee8688811e963a48c3d25a7cc1;hb=63661b6634527fca365d4ac9e46cc9c8c94c1e49;hp=f2a65777c7a4b4549d9900d49d887464f9e3ce2a;hpb=14227bde84a144ed425a12d47337ade48e50bd4e;p=lttng-ust.git diff --git a/include/lttng/tracepoint.h b/include/lttng/tracepoint.h index f2a65777..cf3519cd 100644 --- a/include/lttng/tracepoint.h +++ b/include/lttng/tracepoint.h @@ -11,16 +11,25 @@ #include #include #include +#include +#include +#include + #include #include #include /* for dlopen */ #include /* for memset */ +#include #include /* for sdt */ #include #include #include +#if (defined(__cplusplus) && (__cplusplus <= 199711L)) +#error "C++11 support is required to build tracepoints and providers as C++" +#endif + #define LTTNG_UST_TRACEPOINT_NAME_LEN_MAX 256 #ifdef LTTNG_UST_HAVE_SDT_INTEGRATION @@ -230,11 +239,24 @@ void lttng_ust_tracepoint_unregister_##_provider##___##_name(char *provider_name lttng_ust_tracepoint_provider_unregister(provider_name, event_name, func, data); \ } -extern int lttng_ust_tracepoint_provider_register(const char *provider_name, const char *event_name, +/* + * Registration of tracepoint provider probe functions with + * lttng_ust_tracepoint_provider_register, unregistration with + * lttng_ust_tracepoint_provider_unregister. + */ +int lttng_ust_tracepoint_provider_register(const char *provider_name, const char *event_name, void (*func)(void), void *data, const char *signature); -extern int lttng_ust_tracepoint_provider_unregister(const char *provider_name, const char *event_name, +int lttng_ust_tracepoint_provider_unregister(const char *provider_name, const char *event_name, void (*func)(void), void *data); +/* + * Registration of tracepoint instrumentation modules with lttng_ust_tracepoint_module_register, + * unregistration with lttng_ust_tracepoint_module_unregister. + */ +int lttng_ust_tracepoint_module_register(struct lttng_ust_tracepoint * const *tracepoints_start, + int tracepoints_count); +int lttng_ust_tracepoint_module_unregister(struct lttng_ust_tracepoint * const *tracepoints_start); + /* * tracepoint dynamic linkage handling (callbacks). Hidden visibility: * shared across objects in a module/main executable. @@ -373,9 +395,58 @@ lttng_ust_tracepoint__init_urcu_sym(void) } #endif +/* + * Use getenv() directly and bypass lttng-ust helper functions + * because we may not have access to lttng-ust shared libraries. + */ +#ifdef LTTNG_UST_DEBUG +static inline +bool lttng_ust_tracepoint_logging_debug_enabled(void) +{ + return true; +} +#else /* #ifdef LTTNG_UST_DEBUG */ +static inline +bool lttng_ust_tracepoint_logging_debug_enabled(void) +{ + return getenv("LTTNG_UST_DEBUG"); +} +#endif /* #ifdef LTTNG_UST_DEBUG */ + +#ifdef LTTNG_UST_ABORT_ON_CRITICAL +static inline +bool lttng_ust_tracepoint_logging_abort_on_critical_enabled(void) +{ + return true; +} +#else /* #ifdef LTTNG_UST_ABORT_ON_CRITICAL */ +static inline +bool lttng_ust_tracepoint_logging_abort_on_critical_enabled(void) +{ + return getenv("LTTNG_UST_ABORT_ON_CRITICAL"); +} +#endif + +#define LTTNG_UST_TRACEPOINT_THIS_IP \ + ({ __label__ here; here: &&here; }) + +static void +lttng_ust_tracepoints_print_disabled_message(void) +{ + if (lttng_ust_tracepoint_logging_debug_enabled()) + fprintf(stderr, "lttng-ust-tracepoint [%ld]: Critical: dlopen() failed to find '%s', tracepoints in this binary won't be registered. " + "(at addr=%p in %s() at " __FILE__ ":" lttng_ust_stringify(__LINE__) ")\n", + (long) getpid(), + LTTNG_UST_TRACEPOINT_LIB_SONAME, + LTTNG_UST_TRACEPOINT_THIS_IP, + __func__); + if (lttng_ust_tracepoint_logging_abort_on_critical_enabled()) + abort(); +} + static void lttng_ust__tracepoints__init(void) - lttng_ust_notrace __attribute__((constructor)); + lttng_ust_notrace __attribute__((constructor(LTTNG_UST_CONSTRUCTOR_PRIO))); static void lttng_ust__tracepoints__init(void) { @@ -391,14 +462,16 @@ lttng_ust__tracepoints__init(void) if (!lttng_ust_tracepoint_dlopen_ptr->liblttngust_handle) lttng_ust_tracepoint_dlopen_ptr->liblttngust_handle = dlopen(LTTNG_UST_TRACEPOINT_LIB_SONAME, RTLD_NOW | RTLD_GLOBAL); - if (!lttng_ust_tracepoint_dlopen_ptr->liblttngust_handle) + if (!lttng_ust_tracepoint_dlopen_ptr->liblttngust_handle) { + lttng_ust_tracepoints_print_disabled_message(); return; + } lttng_ust_tracepoint__init_urcu_sym(); } static void lttng_ust__tracepoints__destroy(void) - lttng_ust_notrace __attribute__((destructor)); + lttng_ust_notrace __attribute__((destructor(LTTNG_UST_CONSTRUCTOR_PRIO))); static void lttng_ust__tracepoints__destroy(void) { @@ -510,7 +583,7 @@ extern struct lttng_ust_tracepoint * const __stop_lttng_ust_tracepoints_ptrs[] static void lttng_ust__tracepoints__ptrs_init(void) - lttng_ust_notrace __attribute__((constructor)); + lttng_ust_notrace __attribute__((constructor(LTTNG_UST_CONSTRUCTOR_PRIO))); static void lttng_ust__tracepoints__ptrs_init(void) { @@ -521,8 +594,10 @@ lttng_ust__tracepoints__ptrs_init(void) if (!lttng_ust_tracepoint_dlopen_ptr->liblttngust_handle) lttng_ust_tracepoint_dlopen_ptr->liblttngust_handle = dlopen(LTTNG_UST_TRACEPOINT_LIB_SONAME, RTLD_NOW | RTLD_GLOBAL); - if (!lttng_ust_tracepoint_dlopen_ptr->liblttngust_handle) + if (!lttng_ust_tracepoint_dlopen_ptr->liblttngust_handle) { + lttng_ust_tracepoints_print_disabled_message(); return; + } if (!lttng_ust_tracepoint_destructors_syms_ptr) lttng_ust_tracepoint_destructors_syms_ptr = <tng_ust_tracepoint_destructors_syms; lttng_ust_tracepoint_dlopen_ptr->lttng_ust_tracepoint_module_register = @@ -551,7 +626,7 @@ lttng_ust__tracepoints__ptrs_init(void) static void lttng_ust__tracepoints__ptrs_destroy(void) - lttng_ust_notrace __attribute__((destructor)); + lttng_ust_notrace __attribute__((destructor(LTTNG_UST_CONSTRUCTOR_PRIO))); static void lttng_ust__tracepoints__ptrs_destroy(void) { @@ -770,14 +845,17 @@ lttng_ust__tracepoints__ptrs_destroy(void) #define LTTNG_UST_TRACEPOINT_EVENT_CLASS(provider, name, args, fields) -#define LTTNG_UST_TRACEPOINT_EVENT_INSTANCE(provider, _template, name, args) \ +#define LTTNG_UST_TRACEPOINT_EVENT_INSTANCE(template_provider, template_name, provider, name, args) \ LTTNG_UST__DECLARE_TRACEPOINT(provider, name, LTTNG_UST__TP_PARAMS(args)) \ LTTNG_UST__DEFINE_TRACEPOINT(provider, name, LTTNG_UST__TP_PARAMS(args)) #if LTTNG_UST_COMPAT_API(0) #define TRACEPOINT_EVENT LTTNG_UST_TRACEPOINT_EVENT #define TRACEPOINT_EVENT_CLASS LTTNG_UST_TRACEPOINT_EVENT_CLASS -#define TRACEPOINT_EVENT_INSTANCE LTTNG_UST_TRACEPOINT_EVENT_INSTANCE +#define TRACEPOINT_EVENT_INSTANCE(_provider, _template, _name, args) \ + LTTNG_UST_TRACEPOINT_EVENT_INSTANCE(_provider, _template, \ + _provider, _name, LTTNG_UST__TP_PARAMS(args)) + #endif /* #if LTTNG_UST_COMPAT_API(0) */ #endif /* #ifndef LTTNG_UST_TRACEPOINT_EVENT */