X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=include%2Flttng%2Ftracepoint.h;h=fa39b272d8ff19527fd065c7e393ac947b46c8b2;hb=902e13794ab77170a59123c3c62c5d6204941756;hp=709fadc11db744101ca31656cf297b1f51b2de98;hpb=93ffe3667d076b908015a1e00ce7285da41bf658;p=lttng-ust.git diff --git a/include/lttng/tracepoint.h b/include/lttng/tracepoint.h index 709fadc1..fa39b272 100644 --- a/include/lttng/tracepoint.h +++ b/include/lttng/tracepoint.h @@ -14,10 +14,11 @@ * modified is included with the above copyright notice. */ -#include -#include +#include +#include #include #include /* for dlopen */ +#include #ifdef __cplusplus extern "C" { @@ -37,8 +38,18 @@ extern "C" { * fine too). * Each tuple is also separated by a comma. */ -#define _TP_COMBINE_TOKENS1(_tokena, _tokenb) _tokena##_tokenb -#define _TP_COMBINE_TOKENS(_tokena, _tokenb) _TP_COMBINE_TOKENS1(_tokena, _tokenb) +#define __TP_COMBINE_TOKENS(_tokena, _tokenb) \ + _tokena##_tokenb +#define _TP_COMBINE_TOKENS(_tokena, _tokenb) \ + __TP_COMBINE_TOKENS(_tokena, _tokenb) +#define __TP_COMBINE_TOKENS3(_tokena, _tokenb, _tokenc) \ + _tokena##_tokenb##_tokenc +#define _TP_COMBINE_TOKENS3(_tokena, _tokenb, _tokenc) \ + __TP_COMBINE_TOKENS3(_tokena, _tokenb, _tokenc) +#define __TP_COMBINE_TOKENS4(_tokena, _tokenb, _tokenc, _tokend) \ + _tokena##_tokenb##_tokenc##_tokend +#define _TP_COMBINE_TOKENS4(_tokena, _tokenb, _tokenc, _tokend) \ + __TP_COMBINE_TOKENS4(_tokena, _tokenb, _tokenc, _tokend) /* _TP_EXVAR* extract the var names. */ #define _TP_EXVAR0() @@ -109,10 +120,10 @@ static inline void __tracepoint_cb_##provider##___##name(_TP_ARGS_PROTO(__VA_ARG { \ struct tracepoint_probe *__tp_probe; \ \ - if (!rcu_read_lock_bp) \ + 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 { \ @@ -123,7 +134,7 @@ static inline void __tracepoint_cb_##provider##___##name(_TP_ARGS_PROTO(__VA_ARG (_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) \ @@ -179,7 +190,7 @@ static void __attribute__((constructor)) __tracepoints__init(void) if (__tracepoint_registered++) return; - liblttngust_handle = dlopen("liblttng-ust.so", RTLD_NOW | RTLD_GLOBAL); + liblttngust_handle = dlopen("liblttng-ust-tracepoint.so.0", RTLD_NOW | RTLD_GLOBAL); if (!liblttngust_handle) return; tracepoint_register_lib = @@ -190,6 +201,20 @@ static void __attribute__((constructor)) __tracepoints__init(void) 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); @@ -320,57 +345,96 @@ static void __attribute__((destructor)) __tracepoints__destroy(void) #ifndef TRACEPOINT_LOGLEVEL /* - * Tracepoint Loglevel Declaration Facility - * - * This is a place-holder the tracepoint loglevel declaration, - * overridden by the tracer implementation. + * Tracepoint Loglevels * * Typical use of these loglevels: * - * 1) Declare the mapping between loglevel names and an integer values - * within TRACEPOINT_LOGLEVEL_ENUM(), using tp_loglevel() for each - * tuple. Do _NOT_ add comma (,) nor semicolon (;) between the - * tp_loglevel entries contained within TRACEPOINT_LOGLEVEL_ENUM(). - * Do _NOT_ add comma (,) nor semicolon (;) after the - * TRACEPOINT_LOGLEVEL_ENUM() declaration. The name should be a - * proper C99 identifier. - * - * TRACEPOINT_LOGLEVEL_ENUM( - * tp_loglevel( < loglevel_name >, < value > ) - * tp_loglevel( < loglevel_name >, < value > ) - * ... - * ) - * - * e.g.: - * - * TRACEPOINT_LOGLEVEL_ENUM( - * tp_loglevel(LOG_EMERG, 0) - * tp_loglevel(LOG_ALERT, 1) - * tp_loglevel(LOG_CRIT, 2) - * tp_loglevel(LOG_ERR, 3) - * tp_loglevel(LOG_WARNING, 4) - * tp_loglevel(LOG_NOTICE, 5) - * tp_loglevel(LOG_INFO, 6) - * tp_loglevel(LOG_DEBUG, 7) - * ) - * - * 2) Then, declare tracepoint loglevels for tracepoints. A - * TRACEPOINT_EVENT should be declared prior to the the - * TRACEPOINT_LOGLEVEL for a given tracepoint name. The first field - * is the name of the tracepoint, the second field is the loglevel - * name. + * The loglevels go from 0 to 15. Higher numbers imply the most + * verbosity (higher event throughput expected. + * + * Loglevels 0 through 6, and loglevel 15, match syslog(3) loglevels + * semantic. Loglevels 7 through 14 offer more fine-grained selection of + * traced information. + * + * TRACE_EMERG 0 + * system is unusable + * + * TRACE_ALERT 1 + * action must be taken immediately + * + * TRACE_CRIT 2 + * critical conditions + * + * TRACE_ERR 3 + * error conditions + * + * TRACE_WARNING 4 + * warning conditions + * + * TRACE_NOTICE 5 + * normal, but significant, condition + * + * TRACE_INFO 6 + * informational message + * + * TRACE_SYSTEM 7 + * information has system-level scope (set of programs) + * + * TRACE_PROGRAM 8 + * information has program-level scope (set of processes) + * + * TRACE_PROCESS 9 + * information has process-level scope (set of modules) + * + * TRACE_MODULE 10 + * information has module (executable/library) scope (set of units) + * + * TRACE_UNIT 11 + * information has compilation unit scope (set of functions) + * + * TRACE_FUNCTION 12 + * information has function-level scope + * + * TRACE_DEFAULT 13 + * default trace loglevel (TRACEPOINT_EVENT default) + * + * TRACE_VERBOSE 14 + * verbose information + * + * TRACE_DEBUG 15 + * debug-level message (trace_printf default) + * + * Declare tracepoint loglevels for tracepoints. A TRACEPOINT_EVENT + * should be declared prior to the the TRACEPOINT_LOGLEVEL for a given + * tracepoint name. The first field is the name of the tracepoint, the + * second field is the loglevel name. * * TRACEPOINT_LOGLEVEL(< [com_company_]project[_component] >, < event >, * < loglevel_name >) * - * The TRACEPOINT_PROVIDER must be defined when declaring a - * TRACEPOINT_LOGLEVEL_ENUM and TRACEPOINT_LOGLEVEL. The tracepoint - * loglevel enumeration apply to the entire TRACEPOINT_PROVIDER. Only one - * tracepoint loglevel enumeration should be declared per tracepoint - * provider. + * The TRACEPOINT_PROVIDER must be already declared before declaring a + * TRACEPOINT_LOGLEVEL. */ -#define TRACEPOINT_LOGLEVEL_ENUM(...) +enum { + TRACE_EMERG = 0, + TRACE_ALERT = 1, + TRACE_CRIT = 2, + TRACE_ERR = 3, + TRACE_WARNING = 4, + TRACE_NOTICE = 5, + TRACE_INFO = 6, + TRACE_SYSTEM = 7, + TRACE_PROGRAM = 8, + TRACE_PROCESS = 9, + TRACE_MODULE = 10, + TRACE_UNIT = 11, + TRACE_FUNCTION = 12, + TRACE_DEFAULT = 13, + TRACE_VERBOSE = 14, + TRACE_DEBUG = 15, +}; + #define TRACEPOINT_LOGLEVEL(provider, name, loglevel) #endif /* #ifndef TRACEPOINT_LOGLEVEL */