X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=include%2Flttng%2Fust-tracepoint-event.h;h=d5ffc8aa6171b0267dff132eb98530212ec3ad33;hb=82fa766de8ddb7e5ed9ac9f595bc2f97ee7f3d38;hp=901f491716263c294c3a01fdb8f7341dab61f4f9;hpb=11dfd4ee2d1833b4f67c3016631f8fa411646012;p=lttng-ust.git diff --git a/include/lttng/ust-tracepoint-event.h b/include/lttng/ust-tracepoint-event.h index 901f4917..d5ffc8aa 100644 --- a/include/lttng/ust-tracepoint-event.h +++ b/include/lttng/ust-tracepoint-event.h @@ -77,18 +77,11 @@ */ #undef TRACEPOINT_EVENT -#define TRACEPOINT_EVENT(provider, name, proto, args, fields) \ +#define TRACEPOINT_EVENT(provider, name, args, fields) \ TRACEPOINT_EVENT_CLASS(provider, name, \ - TP_PARAMS(proto), \ TP_PARAMS(args), \ TP_PARAMS(fields)) \ - TRACEPOINT_EVENT_INSTANCE(provider, name, name, TP_PARAMS(proto), TP_PARAMS(args)) - -#undef TRACEPOINT_EVENT_NOARGS -#define TRACEPOINT_EVENT_NOARGS(provider, name, fields) \ - TRACEPOINT_EVENT_CLASS_NOARGS(provider, name, \ - TP_PARAMS(fields)) \ - TRACEPOINT_EVENT_INSTANCE_NOARGS(provider, name, name) + TRACEPOINT_EVENT_INSTANCE(provider, name, name, TP_PARAMS(args)) /* Helpers */ #define _TP_ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) @@ -100,6 +93,40 @@ __max1 > __max2 ? __max1: __max2; \ }) +/* + * Stage 0 of the trace events. + * + * Check that each TRACEPOINT_EVENT provider argument match the + * TRACEPOINT_PROVIDER by creating dummy callbacks. + */ + +/* 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) +{ +} + +#undef TRACEPOINT_EVENT_CLASS +#define TRACEPOINT_EVENT_CLASS(_provider, _name, _args, _fields) \ + __tracepoint_provider_mismatch_##_provider(); + +#undef TRACEPOINT_EVENT_INSTANCE +#define TRACEPOINT_EVENT_INSTANCE(_provider, _template, _name, _args) \ + __tracepoint_provider_mismatch_##_provider(); + +static __attribute__((unused)) +void TP_ID(__tracepoint_provider_check_, TRACEPOINT_PROVIDER)(void) +{ +#include TRACEPOINT_INCLUDE(TRACEPOINT_INCLUDE_FILE) +} + +#undef TP_ID1 +#undef TP_ID /* * Stage 1 of the trace events. @@ -170,16 +197,12 @@ #undef TP_FIELDS #define TP_FIELDS(args...) args /* Only one used in this phase */ -#undef TRACEPOINT_EVENT_CLASS_NOARGS -#define TRACEPOINT_EVENT_CLASS_NOARGS(_provider, _name, _fields) \ +#undef TRACEPOINT_EVENT_CLASS +#define TRACEPOINT_EVENT_CLASS(_provider, _name, _args, _fields) \ static const struct lttng_event_field __event_fields___##_provider##___##_name[] = { \ - _fields \ + _fields \ }; -#undef TRACEPOINT_EVENT_CLASS -#define TRACEPOINT_EVENT_CLASS(_provider, _name, _proto, _args, _fields) \ - TRACEPOINT_EVENT_CLASS_NOARGS(_provider, _name, TP_PARAMS(_fields)) - #include TRACEPOINT_INCLUDE(TRACEPOINT_INCLUDE_FILE) /* @@ -191,16 +214,12 @@ /* Reset all macros within TRACEPOINT_EVENT */ #include -#undef TP_PROTO -#define TP_PROTO(args...) args +#undef TP_ARGS +#define TP_ARGS(args...) args #undef TRACEPOINT_EVENT_CLASS -#define TRACEPOINT_EVENT_CLASS(_provider, _name, _proto, _args, _fields) \ -static void __event_probe__##_provider##___##_name(void *__data, _proto); - -#undef TRACEPOINT_EVENT_CLASS_NOARGS -#define TRACEPOINT_EVENT_CLASS_NOARGS(_provider, _name, _fields) \ -static void __event_probe__##_provider##___##_name(void *__data); +#define TRACEPOINT_EVENT_CLASS(_provider, _name, _args, _fields) \ +static void __event_probe__##_provider##___##_name(_TP_ARGS_PROTO_DATA(_args)); #include TRACEPOINT_INCLUDE(TRACEPOINT_INCLUDE_FILE) @@ -213,8 +232,8 @@ static void __event_probe__##_provider##___##_name(void *__data); /* Reset all macros within TRACEPOINT_EVENT */ #include -#undef TRACEPOINT_EVENT_INSTANCE_NOARGS -#define TRACEPOINT_EVENT_INSTANCE_NOARGS(_provider, _template, _name) \ +#undef TRACEPOINT_EVENT_INSTANCE +#define TRACEPOINT_EVENT_INSTANCE(_provider, _template, _name, _args) \ { \ .fields = __event_fields___##_provider##___##_template,\ .name = #_provider ":" #_name, \ @@ -222,14 +241,10 @@ static void __event_probe__##_provider##___##_name(void *__data); .nr_fields = _TP_ARRAY_SIZE(__event_fields___##_provider##___##_template), \ }, -#undef TRACEPOINT_EVENT_INSTANCE -#define TRACEPOINT_EVENT_INSTANCE(_provider, _template, _name, _proto, _args) \ - TRACEPOINT_EVENT_INSTANCE_NOARGS(_provider, _template, _name) - -#define TP_ID1(_token, _system) _token##_system -#define TP_ID(_token, _system) TP_ID1(_token, _system) +#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_SYSTEM)[] = { +static const struct lttng_event_desc TP_ID(__event_desc___, TRACEPOINT_PROVIDER)[] = { #include TRACEPOINT_INCLUDE(TRACEPOINT_INCLUDE_FILE) }; @@ -243,13 +258,13 @@ static const struct lttng_event_desc TP_ID(__event_desc___, TRACEPOINT_SYSTEM)[] * Create a toplevel descriptor for the whole probe. */ -#define TP_ID1(_token, _system) _token##_system -#define TP_ID(_token, _system) TP_ID1(_token, _system) +#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_SYSTEM) = { - .event_desc = TP_ID(__event_desc___, TRACEPOINT_SYSTEM), - .nr_events = _TP_ARRAY_SIZE(TP_ID(__event_desc___, TRACEPOINT_SYSTEM)), +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)), }; #undef TP_ID1 @@ -293,15 +308,15 @@ static struct lttng_probe_desc TP_ID(__probe_desc___, TRACEPOINT_SYSTEM) = { #define ctf_string(_item, _src) \ __event_len += __dynamic_len[__dynamic_len_idx++] = strlen(_src) + 1; -#undef TP_PROTO -#define TP_PROTO(args...) args +#undef TP_ARGS +#define TP_ARGS(args...) args #undef TP_FIELDS #define TP_FIELDS(args...) args #undef TRACEPOINT_EVENT_CLASS -#define TRACEPOINT_EVENT_CLASS(_provider, _name, _proto, _args, _fields) \ -static inline size_t __event_get_size__##_provider##___##_name(size_t *__dynamic_len, _proto) \ +#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)) \ { \ size_t __event_len = 0; \ unsigned int __dynamic_len_idx = 0; \ @@ -344,15 +359,16 @@ static inline size_t __event_get_size__##_provider##___##_name(size_t *__dynamic #undef ctf_string #define ctf_string(_item, _src) -#undef TP_PROTO -#define TP_PROTO(args...) args +#undef TP_ARGS +#define TP_ARGS(args...) args #undef TP_FIELDS #define TP_FIELDS(args...) args #undef TRACEPOINT_EVENT_CLASS -#define TRACEPOINT_EVENT_CLASS(_provider, _name, _proto, _args, _fields) \ -static inline size_t __event_get_align__##_provider##___##_name(_proto) \ +#define TRACEPOINT_EVENT_CLASS(_provider, _name, _args, _fields) \ +static inline \ +size_t __event_get_align__##_provider##___##_name(_TP_ARGS_PROTO(_args)) \ { \ size_t __event_align = 1; \ _fields \ @@ -418,20 +434,17 @@ static inline size_t __event_get_align__##_provider##___##_name(_proto) \ #undef __get_dynamic_len #define __get_dynamic_len(field) __dynamic_len[__dynamic_len_idx++] -#undef TP_PROTO -#define TP_PROTO(args...) args - -#undef TP_VARS -#define TP_VARS(args...) args +#undef TP_ARGS +#define TP_ARGS(args...) args #undef TP_FIELDS #define TP_FIELDS(args...) args #undef TRACEPOINT_EVENT_CLASS -#define TRACEPOINT_EVENT_CLASS(_provider, _name, _proto, _args, _fields) \ -static void __event_probe__##_provider##___##_name(void *__data, _proto) \ +#define TRACEPOINT_EVENT_CLASS(_provider, _name, _args, _fields) \ +static void __event_probe__##_provider##___##_name(_TP_ARGS_PROTO_DATA(_args))\ { \ - struct ltt_event *__event = __data; \ + struct ltt_event *__event = __tp_cb_data; \ struct ltt_channel *__chan = __event->chan; \ struct lttng_ust_lib_ring_buffer_ctx __ctx; \ size_t __event_len, __event_align; \ @@ -447,35 +460,9 @@ static void __event_probe__##_provider##___##_name(void *__data, _proto) \ return; \ if (caa_unlikely(!CMM_ACCESS_ONCE(__event->enabled))) \ return; \ - __event_len = __event_get_size__##_provider##___##_name(__dynamic_len, _args); \ - __event_align = __event_get_align__##_provider##___##_name(_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); \ - if (__ret < 0) \ - return; \ - _fields \ - __chan->ops->event_commit(&__ctx); \ -} - -#undef TRACEPOINT_EVENT_CLASS_NOARGS -#define TRACEPOINT_EVENT_CLASS_NOARGS(_provider, _name, _fields) \ -static void __event_probe__##_provider##___##_name(void *__data) \ -{ \ - struct ltt_event *__event = __data; \ - struct ltt_channel *__chan = __event->chan; \ - struct lttng_ust_lib_ring_buffer_ctx __ctx; \ - size_t __event_len, __event_align; \ - int __ret; \ - \ - if (caa_unlikely(!CMM_ACCESS_ONCE(__chan->session->active))) \ - return; \ - if (caa_unlikely(!CMM_ACCESS_ONCE(__chan->enabled))) \ - return; \ - if (caa_unlikely(!CMM_ACCESS_ONCE(__event->enabled))) \ - return; \ - __event_len = 0; \ - __event_align = 1; \ + __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)); \ lib_ring_buffer_ctx_init(&__ctx, __chan->chan, __event, __event_len, \ __event_align, -1, __chan->handle); \ __ret = __chan->ops->event_reserve(&__ctx, __event->id); \ @@ -498,22 +485,22 @@ static void __event_probe__##_provider##___##_name(void *__data) \ /* Reset all macros within TRACEPOINT_EVENT */ #include -#define TP_ID1(_token, _system) _token##_system -#define TP_ID(_token, _system) TP_ID1(_token, _system) +#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_SYSTEM)(void) +TP_ID(__lttng_events_init__, TRACEPOINT_PROVIDER)(void) { int ret; - ret = ltt_probe_register(&TP_ID(__probe_desc___, TRACEPOINT_SYSTEM)); + ret = ltt_probe_register(&TP_ID(__probe_desc___, TRACEPOINT_PROVIDER)); assert(!ret); } static void __attribute__((destructor)) -TP_ID(__lttng_events_exit__, TRACEPOINT_SYSTEM)(void) +TP_ID(__lttng_events_exit__, TRACEPOINT_PROVIDER)(void) { - ltt_probe_unregister(&TP_ID(__probe_desc___, TRACEPOINT_SYSTEM)); + ltt_probe_unregister(&TP_ID(__probe_desc___, TRACEPOINT_PROVIDER)); } #undef TP_ID1