X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=probes%2Flttng-events.h;h=b6109f2f55de4eacb3ee86a7892f03612752d404;hb=f3bc08c50e1b302bceea699027d889fd6d9af525;hp=ee7e5d9694fdd6790c152f5ab54f3d9ea95582a2;hpb=58231493cb0831be06b67dae45e2600c2bbf49ce;p=lttng-modules.git diff --git a/probes/lttng-events.h b/probes/lttng-events.h index ee7e5d96..b6109f2f 100644 --- a/probes/lttng-events.h +++ b/probes/lttng-events.h @@ -1,7 +1,7 @@ #include #include #include -#include +#include "../wrapper/ringbuffer/frontend_types.h" #include "../ltt-events.h" #include "../ltt-tracer-core.h" @@ -13,6 +13,7 @@ struct lttng_event_field { struct lttng_event_desc { const struct lttng_event_field *fields; const char *name; + void *probe_callback; unsigned int nr_fields; }; @@ -115,6 +116,23 @@ struct lttng_event_desc { #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) +/* + * Stage 1.1 of the trace events. + * + * Create probe callback prototypes. + */ + +#include "lttng-events-reset.h" /* Reset all macros within TRACE_EVENT */ + +#undef TP_PROTO +#define TP_PROTO(args...) args + +#undef DECLARE_EVENT_CLASS +#define DECLARE_EVENT_CLASS(_name, _proto, _args, _tstruct, _assign, _print) \ +static void __event_probe__##_name(void *__data, _proto); + +#include TRACE_INCLUDE(TRACE_INCLUDE_FILE) + /* * Stage 2 of the trace events. * @@ -130,6 +148,7 @@ struct lttng_event_desc { { \ .fields = __event_fields___##_template, \ .name = #_name, \ + .probe_callback = (void *) &__event_probe__##_template,\ .nr_fields = ARRAY_SIZE(__event_fields___##_template), \ }, @@ -514,6 +533,8 @@ static void __event_probe__##_name(void *__data, _proto) \ \ if (0) \ (void) __dynamic_len_idx; /* don't warn if unused */ \ + if (!ACCESS_ONCE(__chan->session->active)) \ + return; \ __event_len = __event_get_size__##_name(__dynamic_len, _args); \ __event_align = __event_get_align__##_name(_args); \ lib_ring_buffer_ctx_init(&ctx, __chan->chan, NULL, __event_len, \ @@ -531,7 +552,6 @@ static void __event_probe__##_name(void *__data, _proto) \ #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) - /* * Stage 8 of the trace events. * @@ -547,31 +567,47 @@ static void __event_probe__##_name(void *__data, _proto) \ #define module_exit_eval1(_token, _system) module_exit(_token##_system) #define module_exit_eval(_token, _system) module_exit_eval1(_token, _system) -#undef DEFINE_EVENT -#define DEFINE_EVENT(_template, _name, _proto, _args) \ - ret = ltt_probe_register(#_name, (void *) __event_probe__##_template); \ - WARN_ON_ONCE(ret); - static int TP_ID(__lttng_events_init__, TRACE_SYSTEM)(void) { - int ret = 0; + int ret; + int i; ret = TP_ID(__lttng_types_init__, TRACE_SYSTEM)(); if (ret) return ret; -#include TRACE_INCLUDE(TRACE_INCLUDE_FILE) + for (i = 0; i < ARRAY_SIZE(TP_ID(__event_desc___, TRACE_SYSTEM)); i++) { + const struct lttng_event_desc *event_desc; + + event_desc = &TP_ID(__event_desc___, TRACE_SYSTEM)[i]; + ret = ltt_probe_register(event_desc->name, + event_desc->probe_callback); + if (ret) + goto error; + } + return 0; + +error: + for (i--; i >= 0; i--) { + const struct lttng_event_desc *event_desc; + + event_desc = &TP_ID(__event_desc___, TRACE_SYSTEM)[i]; + ltt_probe_unregister(event_desc->name); + } return ret; } module_init_eval(__lttng_events_init__, TRACE_SYSTEM); -#undef DEFINE_EVENT -#define DEFINE_EVENT(_template, _name, _proto, _args) \ - ltt_probe_unregister(#_name); - static void TP_ID(__lttng_events_exit__, TRACE_SYSTEM)(void) { -#include TRACE_INCLUDE(TRACE_INCLUDE_FILE) + int i; + + for (i = 0; i < ARRAY_SIZE(TP_ID(__event_desc___, TRACE_SYSTEM)); i++) { + const struct lttng_event_desc *event_desc; + + event_desc = &TP_ID(__event_desc___, TRACE_SYSTEM)[i]; + ltt_probe_unregister(event_desc->name); + } TP_ID(__lttng_types_exit__, TRACE_SYSTEM)(); }