X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=include%2Flttng%2Fust-tracepoint-event.h;h=6983ef1691d39949e3a72fe11cedf7030cf1d050;hb=44c72f10aa3cace72ffe40a0f9bb7aadb9c82dc8;hp=d5ffc8aa6171b0267dff132eb98530212ec3ad33;hpb=63ef26930fe613a266cc69f5089cf643dd59b012;p=lttng-ust.git diff --git a/include/lttng/ust-tracepoint-event.h b/include/lttng/ust-tracepoint-event.h index d5ffc8aa..6983ef16 100644 --- a/include/lttng/ust-tracepoint-event.h +++ b/include/lttng/ust-tracepoint-event.h @@ -1,27 +1,21 @@ /* - * Copyright (C) 2009 Steven Rostedt - * Copyright (C) 2011 Mathieu Desnoyers + * Copyright (c) 2011 - Mathieu Desnoyers * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License. + * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED + * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * Permission is hereby granted to use or copy this program + * for any purpose, provided the above notices are retained on all copies. + * Permission to modify the code and to distribute modified code is granted, + * provided the above notices are retained, and a notice that the code was + * modified is included with the above copyright notice. */ #include #include #include -#include #include +#include /* * Macro declarations used for all stages. @@ -66,22 +60,23 @@ /* ctf_string is redefined at each step */ /* - * TRACEPOINT_EVENT_CLASS can be used to add a generic function handlers - * for events. That is, if all events have the same parameters and just - * have distinct trace points. Each tracepoint can be defined with - * TRACEPOINT_EVENT_INSTANCE and that will map the - * TRACEPOINT_EVENT_CLASS to the tracepoint. + * TRACEPOINT_EVENT_CLASS declares a class of tracepoints receiving the + * same arguments and having the same field layout. + * + * TRACEPOINT_EVENT_INSTANCE declares an instance of a tracepoint, with + * its own provider and name. It refers to a class (template). * - * TRACEPOINT_EVENT is a one to one mapping between tracepoint and - * template. + * TRACEPOINT_EVENT declared both a class and an instance and does a + * direct mapping from the instance to the class. */ #undef TRACEPOINT_EVENT -#define TRACEPOINT_EVENT(provider, name, args, fields) \ - TRACEPOINT_EVENT_CLASS(provider, name, \ - TP_PARAMS(args), \ - TP_PARAMS(fields)) \ - TRACEPOINT_EVENT_INSTANCE(provider, name, name, TP_PARAMS(args)) +#define TRACEPOINT_EVENT(_provider, _name, _args, _fields) \ + TRACEPOINT_EVENT_CLASS(_provider, _name, \ + _TP_PARAMS(_args), \ + _TP_PARAMS(_fields)) \ + TRACEPOINT_EVENT_INSTANCE(_provider, _name, _name, \ + _TP_PARAMS(args)) /* Helpers */ #define _TP_ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) @@ -94,7 +89,7 @@ }) /* - * Stage 0 of the trace events. + * Stage 0 of tracepoint event generation. * * Check that each TRACEPOINT_EVENT provider argument match the * TRACEPOINT_PROVIDER by creating dummy callbacks. @@ -103,11 +98,8 @@ /* Reset all macros within TRACEPOINT_EVENT */ #include -#define TP_ID1(_token, _provider) _token##_provider -#define TP_ID(_token, _provider) TP_ID1(_token, _provider) - static inline -void TP_ID(__tracepoint_provider_mismatch_, TRACEPOINT_PROVIDER)(void) +void _TP_COMBINE_TOKENS(__tracepoint_provider_mismatch_, TRACEPOINT_PROVIDER)(void) { } @@ -120,16 +112,13 @@ void TP_ID(__tracepoint_provider_mismatch_, TRACEPOINT_PROVIDER)(void) __tracepoint_provider_mismatch_##_provider(); static __attribute__((unused)) -void TP_ID(__tracepoint_provider_check_, TRACEPOINT_PROVIDER)(void) +void _TP_COMBINE_TOKENS(__tracepoint_provider_check_, TRACEPOINT_PROVIDER)(void) { -#include TRACEPOINT_INCLUDE(TRACEPOINT_INCLUDE_FILE) +#include TRACEPOINT_INCLUDE } -#undef TP_ID1 -#undef TP_ID - /* - * Stage 1 of the trace events. + * Stage 1 of tracepoint event generation. * * Create event field type metadata section. * Each event produce an array of fields. @@ -203,10 +192,10 @@ void TP_ID(__tracepoint_provider_check_, TRACEPOINT_PROVIDER)(void) _fields \ }; -#include TRACEPOINT_INCLUDE(TRACEPOINT_INCLUDE_FILE) +#include TRACEPOINT_INCLUDE /* - * Stage 2 of the trace events. + * Stage 2 of tracepoint event generation. * * Create probe callback prototypes. */ @@ -219,12 +208,12 @@ void TP_ID(__tracepoint_provider_check_, TRACEPOINT_PROVIDER)(void) #undef TRACEPOINT_EVENT_CLASS #define TRACEPOINT_EVENT_CLASS(_provider, _name, _args, _fields) \ -static void __event_probe__##_provider##___##_name(_TP_ARGS_PROTO_DATA(_args)); +static void __event_probe__##_provider##___##_name(_TP_ARGS_DATA_PROTO(_args)); -#include TRACEPOINT_INCLUDE(TRACEPOINT_INCLUDE_FILE) +#include TRACEPOINT_INCLUDE /* - * Stage 3 of the trace events. + * Stage 3 of tracepoint event generation. * * Create an array of events. */ @@ -241,37 +230,25 @@ static void __event_probe__##_provider##___##_name(_TP_ARGS_PROTO_DATA(_args)); .nr_fields = _TP_ARRAY_SIZE(__event_fields___##_provider##___##_template), \ }, -#define TP_ID1(_token, _provider) _token##_provider -#define TP_ID(_token, _provider) TP_ID1(_token, _provider) - -static const struct lttng_event_desc TP_ID(__event_desc___, TRACEPOINT_PROVIDER)[] = { -#include TRACEPOINT_INCLUDE(TRACEPOINT_INCLUDE_FILE) +static const struct lttng_event_desc _TP_COMBINE_TOKENS(__event_desc___, TRACEPOINT_PROVIDER)[] = { +#include TRACEPOINT_INCLUDE }; -#undef TP_ID1 -#undef TP_ID - /* - * Stage 4 of the trace events. + * Stage 4 of tracepoint event generation. * * Create a toplevel descriptor for the whole probe. */ -#define TP_ID1(_token, _provider) _token##_provider -#define TP_ID(_token, _provider) TP_ID1(_token, _provider) - /* non-const because list head will be modified when registered. */ -static struct lttng_probe_desc TP_ID(__probe_desc___, TRACEPOINT_PROVIDER) = { - .event_desc = TP_ID(__event_desc___, TRACEPOINT_PROVIDER), - .nr_events = _TP_ARRAY_SIZE(TP_ID(__event_desc___, TRACEPOINT_PROVIDER)), +static struct lttng_probe_desc _TP_COMBINE_TOKENS(__probe_desc___, TRACEPOINT_PROVIDER) = { + .event_desc = _TP_COMBINE_TOKENS(__event_desc___, TRACEPOINT_PROVIDER), + .nr_events = _TP_ARRAY_SIZE(_TP_COMBINE_TOKENS(__event_desc___, TRACEPOINT_PROVIDER)), }; -#undef TP_ID1 -#undef TP_ID - /* - * Stage 5 of the trace events. + * Stage 5 of tracepoint event generation. * * Create static inline function that calculates event size. */ @@ -316,7 +293,7 @@ static struct lttng_probe_desc TP_ID(__probe_desc___, TRACEPOINT_PROVIDER) = { #undef TRACEPOINT_EVENT_CLASS #define TRACEPOINT_EVENT_CLASS(_provider, _name, _args, _fields) \ -static inline size_t __event_get_size__##_provider##___##_name(size_t *__dynamic_len, _TP_ARGS_PROTO_DATA(_args)) \ +static inline size_t __event_get_size__##_provider##___##_name(size_t *__dynamic_len, _TP_ARGS_DATA_PROTO(_args)) \ { \ size_t __event_len = 0; \ unsigned int __dynamic_len_idx = 0; \ @@ -327,10 +304,10 @@ static inline size_t __event_get_size__##_provider##___##_name(size_t *__dynamic return __event_len; \ } -#include TRACEPOINT_INCLUDE(TRACEPOINT_INCLUDE_FILE) +#include TRACEPOINT_INCLUDE /* - * Stage 6 of the trace events. + * Stage 6 of tracepoint event generation. * * Create static inline function that calculates event payload alignment. */ @@ -375,18 +352,14 @@ size_t __event_get_align__##_provider##___##_name(_TP_ARGS_PROTO(_args)) \ return __event_align; \ } -#include TRACEPOINT_INCLUDE(TRACEPOINT_INCLUDE_FILE) +#include TRACEPOINT_INCLUDE /* - * Stage 7 of the trace events. - * - * Create the probe function : call even size calculation and write event data - * into the buffer. + * Stage 7 of tracepoint event generation. * - * We use both the field and assignment macros to write the fields in the order - * defined in the field declaration. The field declarations control the - * execution order, jumping to the appropriate assignment block. + * Create the probe function. This function calls event size calculation + * and writes event data into the buffer. */ /* Reset all macros within TRACEPOINT_EVENT */ @@ -442,11 +415,11 @@ size_t __event_get_align__##_provider##___##_name(_TP_ARGS_PROTO(_args)) \ #undef TRACEPOINT_EVENT_CLASS #define TRACEPOINT_EVENT_CLASS(_provider, _name, _args, _fields) \ -static void __event_probe__##_provider##___##_name(_TP_ARGS_PROTO_DATA(_args))\ +static void __event_probe__##_provider##___##_name(_TP_ARGS_DATA_PROTO(_args))\ { \ - struct ltt_event *__event = __tp_cb_data; \ + struct ltt_event *__event = __tp_data; \ struct ltt_channel *__chan = __event->chan; \ - struct lttng_ust_lib_ring_buffer_ctx __ctx; \ + struct lttng_ust_lib_ring_buffer_ctx __ctx; \ size_t __event_len, __event_align; \ size_t __dynamic_len_idx = 0; \ size_t __dynamic_len[_TP_ARRAY_SIZE(__event_fields___##_provider##___##_name)]; \ @@ -461,8 +434,8 @@ static void __event_probe__##_provider##___##_name(_TP_ARGS_PROTO_DATA(_args))\ if (caa_unlikely(!CMM_ACCESS_ONCE(__event->enabled))) \ return; \ __event_len = __event_get_size__##_provider##___##_name(__dynamic_len,\ - _TP_ARGS_VARS_DATA(_args)); \ - __event_align = __event_get_align__##_provider##___##_name(_TP_ARGS_VARS(_args)); \ + _TP_ARGS_DATA_VAR(_args)); \ + __event_align = __event_get_align__##_provider##___##_name(_TP_ARGS_VAR(_args)); \ lib_ring_buffer_ctx_init(&__ctx, __chan->chan, __event, __event_len, \ __event_align, -1, __chan->handle); \ __ret = __chan->ops->event_reserve(&__ctx, __event->id); \ @@ -472,12 +445,12 @@ static void __event_probe__##_provider##___##_name(_TP_ARGS_PROTO_DATA(_args))\ __chan->ops->event_commit(&__ctx); \ } -#include TRACEPOINT_INCLUDE(TRACEPOINT_INCLUDE_FILE) +#include TRACEPOINT_INCLUDE #undef __get_dynamic_len /* - * Stage 8 of the trace events. + * Stage 8 of tracepoint event generation. * * Register/unregister probes at module load/unload. */ @@ -485,23 +458,17 @@ static void __event_probe__##_provider##___##_name(_TP_ARGS_PROTO_DATA(_args))\ /* Reset all macros within TRACEPOINT_EVENT */ #include -#define TP_ID1(_token, _provider) _token##_provider -#define TP_ID(_token, _provider) TP_ID1(_token, _provider) - static void __attribute__((constructor)) -TP_ID(__lttng_events_init__, TRACEPOINT_PROVIDER)(void) +_TP_COMBINE_TOKENS(__lttng_events_init__, TRACEPOINT_PROVIDER)(void) { int ret; - ret = ltt_probe_register(&TP_ID(__probe_desc___, TRACEPOINT_PROVIDER)); + ret = ltt_probe_register(&_TP_COMBINE_TOKENS(__probe_desc___, TRACEPOINT_PROVIDER)); assert(!ret); } static void __attribute__((destructor)) -TP_ID(__lttng_events_exit__, TRACEPOINT_PROVIDER)(void) +_TP_COMBINE_TOKENS(__lttng_events_exit__, TRACEPOINT_PROVIDER)(void) { - ltt_probe_unregister(&TP_ID(__probe_desc___, TRACEPOINT_PROVIDER)); + ltt_probe_unregister(&_TP_COMBINE_TOKENS(__probe_desc___, TRACEPOINT_PROVIDER)); } - -#undef TP_ID1 -#undef TP_ID