X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=probes%2Flttng-events.h;h=3a5a3b9cd61c5aeba731e7232b19d398ad5c0584;hb=c0edae1dda4cc03efda4790b57db0c3f9684486f;hp=a05c29d56771b89807ffef035b7cd6df34a0b97f;hpb=52fc2e1ff4b6e6a1050bc211ff32a6ccb977d7a4;p=lttng-modules.git diff --git a/probes/lttng-events.h b/probes/lttng-events.h index a05c29d5..3a5a3b9c 100644 --- a/probes/lttng-events.h +++ b/probes/lttng-events.h @@ -1,21 +1,11 @@ -#include -#include #include -#include +#include "lttng.h" +#include "lttng-types.h" +#include "../wrapper/vmalloc.h" /* for wrapper_vmalloc_sync_all() */ +#include "../wrapper/ringbuffer/frontend_types.h" #include "../ltt-events.h" #include "../ltt-tracer-core.h" -struct lttng_event_field { - const char *name; - const struct lttng_type type; -}; - -struct lttng_event_desc { - const struct lttng_event_field *fields; - const char *name; - unsigned int nr_fields; -}; - /* * Macro declarations used for all stages. */ @@ -51,6 +41,28 @@ struct lttng_event_desc { TRACE_EVENT(name, PARAMS(proto), PARAMS(args), \ PARAMS(tstruct), PARAMS(assign), PARAMS(print)) \ +/* + * Stage 0.1 of the trace events. + * + * Create dummy trace calls for each events, verifying that the LTTng module + * TRACE_EVENT headers match the kernel arguments. Will be optimized out by the + * compiler. + */ + +#include "lttng-events-reset.h" /* Reset all macros within TRACE_EVENT */ + +#undef TP_PROTO +#define TP_PROTO(args...) args + +#undef TP_ARGS +#define TP_ARGS(args...) args + +#undef DEFINE_EVENT +#define DEFINE_EVENT(_template, _name, _proto, _args) \ +void trace_##_name(_proto); + +#include TRACE_INCLUDE(TRACE_INCLUDE_FILE) + /* * Stage 1 of the trace events. * @@ -115,6 +127,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 +159,7 @@ struct lttng_event_desc { { \ .fields = __event_fields___##_template, \ .name = #_name, \ + .probe_callback = (void *) &__event_probe__##_template,\ .nr_fields = ARRAY_SIZE(__event_fields___##_template), \ }, @@ -533,7 +563,6 @@ static void __event_probe__##_name(void *__data, _proto) \ #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) - /* * Stage 8 of the trace events. * @@ -549,31 +578,48 @@ 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; + wrapper_vmalloc_sync_all(); 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)(); }