----- Original Message ----- > From: "Geneviève Bastien" <[email protected]> > To: [email protected] > Sent: Friday, January 24, 2014 3:04:44 PM > Subject: [lttng-dev] [Patch LTTng-ust 6/7] Add the macros to generate the > data structures for CTF named enumerations > > Fills the macros to initialize the metadata for a tracepoint. > > From this patch on, the named metadata are enabled.
Now that I think about it, "named metadata" does not seem to be semantically clear. Perhaps we could change this to "global type declarations" ? Because this is really what it is: type declarations that are in the global scope of the metadata. This applies to all other patches in this series. > > Signed-off-by: Geneviève Bastien <[email protected]> > --- > include/lttng/ust-tracepoint-event.h | 141 > ++++++++++++++++++++++++++++++++++- > 1 file changed, 140 insertions(+), 1 deletion(-) > > diff --git a/include/lttng/ust-tracepoint-event.h > b/include/lttng/ust-tracepoint-event.h > index f7b9d32..7b4a998 100644 > --- a/include/lttng/ust-tracepoint-event.h > +++ b/include/lttng/ust-tracepoint-event.h > @@ -114,6 +114,39 @@ static const char > \ > #include TRACEPOINT_INCLUDE > > /* > + * Stage 0.9 of tracepoint event generation > + * > + * Unfolding the enums > + */ > +#include <lttng/ust-tracepoint-event-reset.h> > + > +/* Enumeration entry (single value) */ > +#undef ctf_enum_value > +#define ctf_enum_value(_string, _value) \ > + { _value, _value, #_string }, > + > +/* Enumeration entry (range) */ > +#undef ctf_enum_range > +#define ctf_enum_range(_string, _range_start, _range_end) \ > + { _range_start, _range_end, #_string }, > + > +#undef TP_ENUM_VALUES > +#define TP_ENUM_VALUES(...) \ > + __VA_ARGS__ > + > +#undef TRACE_EVENT_ENUM > +#define TRACE_EVENT_ENUM(_name, _values) > + > + > +#undef TRACEPOINT_ENUM > +#define TRACEPOINT_ENUM(_provider, _name, _type, _values) \ > + const struct lttng_enum_entry __enum_values__##_provider##_##_name[] = > {\ Missing space before \ > + _values \ > + }; > + > +#include TRACEPOINT_INCLUDE > + > +/* > * Stage 1 of tracepoint event generation. > * > * Create event field type metadata section. > @@ -195,6 +228,24 @@ static const char > \ > .nowrite = _nowrite, \ > }, > > +#undef _ctf_enum > +#define _ctf_enum(_provider, _name, _item, _src, _nowrite) \ > + { \ > + .name = #_item, \ > + .type = \ > + { \ Here and below, let's try to keep the { on the same line as the =. (keeping the newline after the { ). > + .atype = atype_enum, \ > + .u = \ > + { \ same here. > + .basic = { .enumeration = \ > + { .name = #_provider "_" #_name },\ same here. missing space before \. you might want to split this into: { .name ..... }, > + }, \ > + }, \ > + }, \ > + .nowrite = _nowrite, \ > + }, > + > + > #undef TP_FIELDS > #define TP_FIELDS(...) __VA_ARGS__ /* Only one used in this phase */ > > @@ -204,6 +255,57 @@ static const char > \ > _fields > \ > }; > > +#undef TRACEPOINT_ENUM > +#define TRACEPOINT_ENUM(_provider, _name, _type, _values) \ > + static const struct lttng_enum __enum_##_provider##_##_name = { \ > + .name = #_provider "_" #_name, \ > + .container_type = { \ > + .size = sizeof(_type) * CHAR_BIT, \ > + .alignment = lttng_alignof(_type) * CHAR_BIT, \ > + .signedness = lttng_is_signed_type(_type), \ > + .reverse_byte_order = 0, \ > + .base = 10, \ > + .encoding = lttng_encode_none, \ > + }, \ > + .entries = __enum_values__##_provider##_##_name, \ > + .len = _TP_ARRAY_SIZE(__enum_values__##_provider##_##_name),\ missing space before \ > + }; \ > + > + > +#include TRACEPOINT_INCLUDE > + > +/* > + * Stage 1.1 of tracepoint event generation. > + * > + * Create the metadata structures for each field > + */ > + > +/* Reset all macros within TRACEPOINT_EVENT */ > +#include <lttng/ust-tracepoint-event-reset.h> > +#include <lttng/ust-tracepoint-event-write.h> > +#include <lttng/ust-tracepoint-event-nowrite.h> > + > +#undef _ctf_enum > +#define _ctf_enum(_provider, _name, _item, _src, _nowrite) \ > + { \ > + .mtype = mtype_enum, \ > + .nowrite = _nowrite, \ > + .u = \ > + { \ > + .ctf_enum = &__enum_##_provider##_##_name, \ > + }, \ > + }, > + > + > +#undef TP_FIELDS > +#define TP_FIELDS(...) __VA_ARGS__ /* Only one used in this phase */ > + > +#undef TRACEPOINT_EVENT_CLASS > +#define TRACEPOINT_EVENT_CLASS(_provider, _name, _args, _fields)\ > + static const struct lttng_named_metadata > __metadata_for___##_provider##___##_name[] = {\ > + _fields \ above, missing space before \ > + }; > + > #include TRACEPOINT_INCLUDE > > /* > @@ -263,6 +365,10 @@ static void > __event_probe__##_provider##___##_name(_TP_ARGS_DATA_PROTO(_args)); > #define _ctf_string(_item, _src, _nowrite) \ > __event_len += __dynamic_len[__dynamic_len_idx++] = strlen(_src) + 1; > > +#undef _ctf_enum > +#define _ctf_enum(_provider, _name, _item, _src, _nowrite) \ > + __event_len += __enum_get_size__##_provider##___##_name(__event_len); > + > #undef TP_ARGS > #define TP_ARGS(...) __VA_ARGS__ > > @@ -285,6 +391,18 @@ size_t __event_get_size__##_provider##___##_name(size_t > *__dynamic_len, _TP_ARGS > return __event_len; \ > } > > +#undef TRACEPOINT_ENUM > +#define TRACEPOINT_ENUM(_provider, _name, _type, _values) \ > +static inline > \ > +size_t __enum_get_size__##_provider##___##_name(size_t __event_len) \ > +{ > \ > + size_t __enum_len = 0; > \ > + __enum_len = lib_ring_buffer_align(__event_len, lttng_alignof(_type));\ missing space before \ > + __enum_len += sizeof(_type); > \ > + return __enum_len; > \ > +} > + > + > #include TRACEPOINT_INCLUDE > > /* > @@ -399,6 +517,10 @@ void > __event_prepare_filter_stack__##_provider##___##_name(char *__stack_data,\ > #undef _ctf_string > #define _ctf_string(_item, _src, _nowrite) > > +#undef _ctf_enum > +#define _ctf_enum(_provider, _name, _item, _src, _nowrite) \ > + __event_align = _tp_max_t(size_t, __event_align, > __enum_get_align__##_provider##___##_name()); > + > #undef TP_ARGS > #define TP_ARGS(...) __VA_ARGS__ > > @@ -417,6 +539,14 @@ size_t > __event_get_align__##_provider##___##_name(_TP_ARGS_PROTO(_args)) \ > return __event_align; \ > } > > +#undef TRACEPOINT_ENUM > +#define TRACEPOINT_ENUM(_provider, _name, _type, _values) \ > +static inline > \ > +size_t __enum_get_align__##_provider##___##_name(void) \ > +{ > \ > + return lttng_alignof(_type); > \ > +} > + > #include TRACEPOINT_INCLUDE > > > @@ -469,6 +599,14 @@ size_t > __event_get_align__##_provider##___##_name(_TP_ARGS_PROTO(_args)) \ > lib_ring_buffer_align_ctx(&__ctx, lttng_alignof(*(_src))); \ > __chan->ops->event_write(&__ctx, _src, __get_dynamic_len(dest)); > > +#undef _ctf_enum > +#define _ctf_enum(_provider, _name, _item, _src, _nowrite) \ > + { \ > + int __tmp = (_src); \ > + lib_ring_buffer_align_ctx(&__ctx, lttng_alignof(__tmp));\ > + __chan->ops->event_write(&__ctx, &__tmp, sizeof(__tmp));\ missing space before each \ Thanks, Mathieu > + } > + > /* Beware: this get len actually consumes the len value */ > #undef __get_dynamic_len > #define __get_dynamic_len(field) > __stackvar.__dynamic_len[__dynamic_len_idx++] > @@ -646,7 +784,8 @@ const struct lttng_event_desc > __event_desc___##_provider##_##_name = { \ > .signature = __tp_event_signature___##_provider##___##_template, \ > .u = { .ext = > \ > { .model_emf_uri = > &__ref_model_emf_uri___##_provider##___##_name,\ > - .nr_metadata = 0, > \ > + .nr_metadata = > _TP_ARRAY_SIZE(__metadata_for___##_provider##___##_name),\ > + .named_metadata = __metadata_for___##_provider##___##_name, > \ > } > \ > }, > \ > }; > -- > 1.8.5.3 > > > _______________________________________________ > lttng-dev mailing list > [email protected] > http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev > -- Mathieu Desnoyers EfficiOS Inc. http://www.efficios.com _______________________________________________ lttng-dev mailing list [email protected] http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
