X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=include%2Flttng%2Fust-tracepoint-event.h;h=3408cb92d903511f1b8916bcb7cc3ab12d6b7a61;hb=4e48b5d;hp=2bb4a38ee7df3e7f9751c94ec81a9d943d3db011;hpb=4ea4f80e8c57628907b035bd1a0372f7b8faec51;p=lttng-ust.git diff --git a/include/lttng/ust-tracepoint-event.h b/include/lttng/ust-tracepoint-event.h index 2bb4a38e..3408cb92 100644 --- a/include/lttng/ust-tracepoint-event.h +++ b/include/lttng/ust-tracepoint-event.h @@ -1,43 +1,29 @@ /* - * Copyright (c) 2011-2012 - Mathieu Desnoyers + * SPDX-License-Identifier: MIT * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. + * Copyright (C) 2011-2012 Mathieu Desnoyers */ +#include #include #include #include #include #include -#include +#include +#include #include #include -#include +#include #include #define __LTTNG_UST_NULL_STRING "(null)" #undef tp_list_for_each_entry_rcu #define tp_list_for_each_entry_rcu(pos, head, member) \ - for (pos = cds_list_entry(tp_rcu_dereference_bp((head)->next), __typeof__(*pos), member); \ + for (pos = cds_list_entry(tp_rcu_dereference((head)->next), __typeof__(*pos), member); \ &pos->member != (head); \ - pos = cds_list_entry(tp_rcu_dereference_bp(pos->member.next), __typeof__(*pos), member)) + pos = cds_list_entry(tp_rcu_dereference(pos->member.next), __typeof__(*pos), member)) /* * TRACEPOINT_EVENT_CLASS declares a class of tracepoints receiving the @@ -52,12 +38,20 @@ #undef TRACEPOINT_EVENT #define TRACEPOINT_EVENT(_provider, _name, _args, _fields) \ - TRACEPOINT_EVENT_CLASS(_provider, _name, \ + _TRACEPOINT_EVENT_CLASS(_provider, _name, \ _TP_PARAMS(_args), \ _TP_PARAMS(_fields)) \ - TRACEPOINT_EVENT_INSTANCE(_provider, _name, _name, \ + _TRACEPOINT_EVENT_INSTANCE(_provider, _name, _name, \ _TP_PARAMS(_args)) +#undef TRACEPOINT_EVENT_CLASS +#define TRACEPOINT_EVENT_CLASS(_provider, _name, _args, _fields) \ + _TRACEPOINT_EVENT_CLASS(_provider, _name, _TP_PARAMS(_args), _TP_PARAMS(_fields)) + +#undef TRACEPOINT_EVENT_INSTANCE +#define TRACEPOINT_EVENT_INSTANCE(_provider, _template, _name, _args) \ + _TRACEPOINT_EVENT_INSTANCE(_provider, _template, _name, _TP_PARAMS(_args)) + /* Helpers */ #define _TP_ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) @@ -78,23 +72,25 @@ /* Reset all macros within TRACEPOINT_EVENT */ #include -static inline lttng_ust_notrace -void _TP_COMBINE_TOKENS(__tracepoint_provider_mismatch_, TRACEPOINT_PROVIDER)(void); +static inline +void _TP_COMBINE_TOKENS(__tracepoint_provider_mismatch_, TRACEPOINT_PROVIDER)(void) + lttng_ust_notrace; static inline void _TP_COMBINE_TOKENS(__tracepoint_provider_mismatch_, TRACEPOINT_PROVIDER)(void) { } -#undef TRACEPOINT_EVENT_CLASS -#define TRACEPOINT_EVENT_CLASS(_provider, _name, _args, _fields) \ +#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) \ +#undef _TRACEPOINT_EVENT_INSTANCE +#define _TRACEPOINT_EVENT_INSTANCE(_provider, _template, _name, _args) \ __tracepoint_provider_mismatch_##_provider(); -static inline lttng_ust_notrace -void _TP_COMBINE_TOKENS(__tracepoint_provider_check_, TRACEPOINT_PROVIDER)(void); +static inline +void _TP_COMBINE_TOKENS(__tracepoint_provider_check_, TRACEPOINT_PROVIDER)(void) + lttng_ust_notrace; static inline void _TP_COMBINE_TOKENS(__tracepoint_provider_check_, TRACEPOINT_PROVIDER)(void) { @@ -111,15 +107,39 @@ void _TP_COMBINE_TOKENS(__tracepoint_provider_check_, TRACEPOINT_PROVIDER)(void) /* Reset all macros within TRACEPOINT_EVENT */ #include -#undef TRACEPOINT_EVENT_INSTANCE -#define TRACEPOINT_EVENT_INSTANCE(_provider, _template, _name, _args) \ +#undef _TRACEPOINT_EVENT_INSTANCE +#define _TRACEPOINT_EVENT_INSTANCE(_provider, _template, _name, _args) \ static const char \ - __tp_name_len_check##_provider##___##_name[LTTNG_UST_SYM_NAME_LEN] \ + __tp_name_len_check##_provider##___##_name[LTTNG_UST_ABI_SYM_NAME_LEN] \ __attribute__((unused)) = \ #_provider ":" #_name; #include TRACEPOINT_INCLUDE +/* + * Stage 0.2 of tracepoint event generation. + * + * Create dummy trace prototypes for each event class, and for each used + * template. This will allow checking whether the prototypes from the + * class and the instance using the class actually match. + */ + +/* Reset all macros within TRACEPOINT_EVENT */ +#include + +#undef TP_ARGS +#define TP_ARGS(...) __VA_ARGS__ + +#undef _TRACEPOINT_EVENT_INSTANCE +#define _TRACEPOINT_EVENT_INSTANCE(_provider, _template, _name, _args) \ +void __event_template_proto___##_provider##___##_template(_TP_ARGS_DATA_PROTO(_args)); + +#undef _TRACEPOINT_EVENT_CLASS +#define _TRACEPOINT_EVENT_CLASS(_provider, _name, _args, _fields) \ +void __event_template_proto___##_provider##___##_name(_TP_ARGS_DATA_PROTO(_args)); + +#include TRACEPOINT_INCLUDE + /* * Stage 0.9 of tracepoint event generation * @@ -130,41 +150,44 @@ static const char \ /* Enumeration entry (single value) */ #undef ctf_enum_value #define ctf_enum_value(_string, _value) \ - { \ + __LTTNG_COMPOUND_LITERAL(const struct lttng_ust_enum_entry, { \ + .struct_size = sizeof(struct lttng_ust_enum_entry), \ .start = { \ - .value = lttng_is_signed_type(__typeof__(_value)) ? \ + .value = lttng_ust_is_signed_type(__typeof__(_value)) ? \ (long long) (_value) : (_value), \ - .signedness = lttng_is_signed_type(__typeof__(_value)), \ + .signedness = lttng_ust_is_signed_type(__typeof__(_value)), \ }, \ .end = { \ - .value = lttng_is_signed_type(__typeof__(_value)) ? \ + .value = lttng_ust_is_signed_type(__typeof__(_value)) ? \ (long long) (_value) : (_value), \ - .signedness = lttng_is_signed_type(__typeof__(_value)), \ + .signedness = lttng_ust_is_signed_type(__typeof__(_value)), \ }, \ .string = (_string), \ - }, + }), /* Enumeration entry (range) */ #undef ctf_enum_range #define ctf_enum_range(_string, _range_start, _range_end) \ - { \ + __LTTNG_COMPOUND_LITERAL(const struct lttng_ust_enum_entry, { \ + .struct_size = sizeof(struct lttng_ust_enum_entry), \ .start = { \ - .value = lttng_is_signed_type(__typeof__(_range_start)) ? \ + .value = lttng_ust_is_signed_type(__typeof__(_range_start)) ? \ (long long) (_range_start) : (_range_start), \ - .signedness = lttng_is_signed_type(__typeof__(_range_start)), \ + .signedness = lttng_ust_is_signed_type(__typeof__(_range_start)), \ }, \ .end = { \ - .value = lttng_is_signed_type(__typeof__(_range_end)) ? \ + .value = lttng_ust_is_signed_type(__typeof__(_range_end)) ? \ (long long) (_range_end) : (_range_end), \ - .signedness = lttng_is_signed_type(__typeof__(_range_end)), \ + .signedness = lttng_ust_is_signed_type(__typeof__(_range_end)), \ }, \ .string = (_string), \ - }, + }), /* Enumeration entry (automatic value; follows the rules of CTF) */ #undef ctf_enum_auto -#define ctf_enum_auto(_string) \ - { \ +#define ctf_enum_auto(_string) \ + __LTTNG_COMPOUND_LITERAL(const struct lttng_ust_enum_entry, { \ + .struct_size = sizeof(struct lttng_ust_enum_entry), \ .start = { \ .value = -1ULL, \ .signedness = 0, \ @@ -174,12 +197,8 @@ static const char \ .signedness = 0, \ }, \ .string = (_string), \ - .u = { \ - .extra = { \ - .options = LTTNG_ENUM_ENTRY_OPTION_IS_AUTO, \ - }, \ - }, \ - }, + .options = LTTNG_UST_ENUM_ENTRY_OPTION_IS_AUTO, \ + }), #undef TP_ENUM_VALUES #define TP_ENUM_VALUES(...) \ @@ -187,10 +206,40 @@ static const char \ #undef TRACEPOINT_ENUM #define TRACEPOINT_ENUM(_provider, _name, _values) \ - const struct lttng_enum_entry __enum_values__##_provider##_##_name[] = { \ + const struct lttng_ust_enum_entry *__enum_values__##_provider##_##_name[] = { \ _values \ ctf_enum_value("", 0) /* Dummy, 0-len array forbidden by C99. */ \ }; +#include TRACEPOINT_INCLUDE + +/* + * Stage 0.9.1 + * Verifying array and sequence elements are of an integer type. + */ + +/* Reset all macros within TRACEPOINT_EVENT */ +#include +#include +#include + +#undef _ctf_array_encoded +#define _ctf_array_encoded(_type, _item, _src, _byte_order, \ + _length, _encoding, _nowrite, \ + _elem_type_base) \ + lttng_ust_ctf_array_element_type_is_supported(_type, _item) + +#undef _ctf_sequence_encoded +#define _ctf_sequence_encoded(_type, _item, _src, _byte_order, \ + _length_type, _src_length, _encoding, _nowrite, \ + _elem_type_base) \ + lttng_ust_ctf_array_element_type_is_supported(_type, _item) + +#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) \ + _fields #include TRACEPOINT_INCLUDE @@ -207,116 +256,124 @@ static const char \ #include #undef _ctf_integer_ext -#define _ctf_integer_ext(_type, _item, _src, _byte_order, _base, _nowrite) \ - { \ - .name = #_item, \ - .type = __type_integer(_type, _byte_order, _base, none),\ - .nowrite = _nowrite, \ - }, +#define _ctf_integer_ext(_type, _item, _src, _byte_order, _base, _nowrite) \ + __LTTNG_COMPOUND_LITERAL(const struct lttng_ust_event_field, { \ + .struct_size = sizeof(struct lttng_ust_event_field), \ + .name = #_item, \ + .type = lttng_ust_type_integer_define(_type, _byte_order, _base), \ + .nowrite = _nowrite, \ + .nofilter = 0, \ + }), #undef _ctf_float #define _ctf_float(_type, _item, _src, _nowrite) \ - { \ - .name = #_item, \ - .type = __type_float(_type), \ - .nowrite = _nowrite, \ - }, + __LTTNG_COMPOUND_LITERAL(const struct lttng_ust_event_field, { \ + .struct_size = sizeof(struct lttng_ust_event_field), \ + .name = #_item, \ + .type = lttng_ust_type_float_define(_type), \ + .nowrite = _nowrite, \ + .nofilter = 0, \ + }), #undef _ctf_array_encoded #define _ctf_array_encoded(_type, _item, _src, _byte_order, \ _length, _encoding, _nowrite, \ _elem_type_base) \ - { \ - .name = #_item, \ - .type = \ - { \ - .atype = atype_array, \ - .u = \ - { \ - .array = \ - { \ - .elem_type = __type_integer(_type, _byte_order, _elem_type_base, _encoding), \ - .length = _length, \ - } \ - } \ - }, \ - .nowrite = _nowrite, \ - }, + __LTTNG_COMPOUND_LITERAL(const struct lttng_ust_event_field, { \ + .struct_size = sizeof(struct lttng_ust_event_field), \ + .name = #_item, \ + .type = (const struct lttng_ust_type_common *) __LTTNG_COMPOUND_LITERAL(const struct lttng_ust_type_array, { \ + .parent = { \ + .type = lttng_ust_type_array, \ + }, \ + .struct_size = sizeof(struct lttng_ust_type_array), \ + .elem_type = lttng_ust_type_integer_define(_type, _byte_order, _elem_type_base), \ + .length = _length, \ + .alignment = 0, \ + .encoding = lttng_ust_string_encoding_##_encoding, \ + }), \ + .nowrite = _nowrite, \ + .nofilter = 0, \ + }), #undef _ctf_sequence_encoded #define _ctf_sequence_encoded(_type, _item, _src, _byte_order, \ _length_type, _src_length, _encoding, _nowrite, \ _elem_type_base) \ - { \ - .name = #_item, \ - .type = \ - { \ - .atype = atype_sequence, \ - .u = \ - { \ - .sequence = \ - { \ - .length_type = __type_integer(_length_type, BYTE_ORDER, 10, none), \ - .elem_type = __type_integer(_type, _byte_order, _elem_type_base, _encoding), \ - }, \ + __LTTNG_COMPOUND_LITERAL(const struct lttng_ust_event_field, { \ + .struct_size = sizeof(struct lttng_ust_event_field), \ + .name = "_" #_item "_length", \ + .type = lttng_ust_type_integer_define(_length_type, BYTE_ORDER, 10), \ + .nowrite = _nowrite, \ + .nofilter = 1, \ + }), \ + __LTTNG_COMPOUND_LITERAL(const struct lttng_ust_event_field, { \ + .struct_size = sizeof(struct lttng_ust_event_field), \ + .name = #_item, \ + .type = (const struct lttng_ust_type_common *) __LTTNG_COMPOUND_LITERAL(const struct lttng_ust_type_sequence, { \ + .parent = { \ + .type = lttng_ust_type_sequence, \ }, \ - }, \ - .nowrite = _nowrite, \ - }, + .struct_size = sizeof(struct lttng_ust_type_sequence), \ + .length_name = "_" #_item "_length", \ + .elem_type = lttng_ust_type_integer_define(_type, _byte_order, _elem_type_base), \ + .alignment = 0, \ + .encoding = lttng_ust_string_encoding_##_encoding, \ + }), \ + .nowrite = _nowrite, \ + .nofilter = 0, \ + }), #undef _ctf_string #define _ctf_string(_item, _src, _nowrite) \ - { \ - .name = #_item, \ - .type = \ - { \ - .atype = atype_string, \ - .u = \ - { \ - .basic = { .string = { .encoding = lttng_encode_UTF8 } } \ + __LTTNG_COMPOUND_LITERAL(const struct lttng_ust_event_field, { \ + .struct_size = sizeof(struct lttng_ust_event_field), \ + .name = #_item, \ + .type = (const struct lttng_ust_type_common *) __LTTNG_COMPOUND_LITERAL(const struct lttng_ust_type_string, { \ + .parent = { \ + .type = lttng_ust_type_string, \ }, \ - }, \ - .nowrite = _nowrite, \ - }, + .struct_size = sizeof(struct lttng_ust_type_string), \ + .encoding = lttng_ust_string_encoding_UTF8, \ + }), \ + .nowrite = _nowrite, \ + .nofilter = 0, \ + }), + +#undef _ctf_unused +#define _ctf_unused(_src) #undef _ctf_enum #define _ctf_enum(_provider, _name, _type, _item, _src, _nowrite) \ - { \ + __LTTNG_COMPOUND_LITERAL(const struct lttng_ust_event_field, { \ + .struct_size = sizeof(struct lttng_ust_event_field), \ .name = #_item, \ - .type = { \ - .atype = atype_enum, \ - .u = { \ - .basic = { \ - .enumeration = { \ - .desc = &__enum_##_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, \ - }, \ - }, \ - }, \ + .type = (const struct lttng_ust_type_common *) __LTTNG_COMPOUND_LITERAL(const struct lttng_ust_type_enum, { \ + .parent = { \ + .type = lttng_ust_type_enum, \ }, \ - }, \ + .struct_size = sizeof(struct lttng_ust_type_enum), \ + .desc = &__enum_##_provider##_##_name, \ + .container_type = lttng_ust_type_integer_define(_type, BYTE_ORDER, 10), \ + }), \ .nowrite = _nowrite, \ - }, + .nofilter = 0, \ + }), #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_event_field __event_fields___##_provider##___##_name[] = { \ +#undef _TRACEPOINT_EVENT_CLASS +#define _TRACEPOINT_EVENT_CLASS(_provider, _name, _args, _fields) \ + static const struct lttng_ust_event_field *__event_fields___##_provider##___##_name[] = { \ _fields \ ctf_integer(int, dummy, 0) /* Dummy, C99 forbids 0-len array. */ \ }; #undef TRACEPOINT_ENUM #define TRACEPOINT_ENUM(_provider, _name, _values) \ - static const struct lttng_enum_desc __enum_##_provider##_##_name = { \ + static const struct lttng_ust_enum_desc __enum_##_provider##_##_name = { \ + .struct_size = sizeof(struct lttng_ust_enum_desc), \ .name = #_provider "_" #_name, \ .entries = __enum_values__##_provider##_##_name, \ .nr_entries = _TP_ARRAY_SIZE(__enum_values__##_provider##_##_name) - 1, \ @@ -336,8 +393,8 @@ static const char \ #undef TP_ARGS #define TP_ARGS(...) __VA_ARGS__ -#undef TRACEPOINT_EVENT_CLASS -#define TRACEPOINT_EVENT_CLASS(_provider, _name, _args, _fields) \ +#undef _TRACEPOINT_EVENT_CLASS +#define _TRACEPOINT_EVENT_CLASS(_provider, _name, _args, _fields) \ static void __event_probe__##_provider##___##_name(_TP_ARGS_DATA_PROTO(_args)); #include TRACEPOINT_INCLUDE @@ -354,26 +411,34 @@ static void __event_probe__##_provider##___##_name(_TP_ARGS_DATA_PROTO(_args)); #undef _ctf_integer_ext #define _ctf_integer_ext(_type, _item, _src, _byte_order, _base, _nowrite) \ - __event_len += lib_ring_buffer_align(__event_len, lttng_alignof(_type)); \ + if (0) \ + (void) (_src); /* Unused */ \ + __event_len += lttng_ust_lib_ring_buffer_align(__event_len, lttng_ust_rb_alignof(_type)); \ __event_len += sizeof(_type); #undef _ctf_float #define _ctf_float(_type, _item, _src, _nowrite) \ - __event_len += lib_ring_buffer_align(__event_len, lttng_alignof(_type)); \ + if (0) \ + (void) (_src); /* Unused */ \ + __event_len += lttng_ust_lib_ring_buffer_align(__event_len, lttng_ust_rb_alignof(_type)); \ __event_len += sizeof(_type); #undef _ctf_array_encoded #define _ctf_array_encoded(_type, _item, _src, _byte_order, _length, _encoding, \ _nowrite, _elem_type_base) \ - __event_len += lib_ring_buffer_align(__event_len, lttng_alignof(_type)); \ + if (0) \ + (void) (_src); /* Unused */ \ + __event_len += lttng_ust_lib_ring_buffer_align(__event_len, lttng_ust_rb_alignof(_type)); \ __event_len += sizeof(_type) * (_length); #undef _ctf_sequence_encoded #define _ctf_sequence_encoded(_type, _item, _src, _byte_order, _length_type, \ _src_length, _encoding, _nowrite, _elem_type_base) \ - __event_len += lib_ring_buffer_align(__event_len, lttng_alignof(_length_type)); \ + if (0) \ + (void) (_src); /* Unused */ \ + __event_len += lttng_ust_lib_ring_buffer_align(__event_len, lttng_ust_rb_alignof(_length_type)); \ __event_len += sizeof(_length_type); \ - __event_len += lib_ring_buffer_align(__event_len, lttng_alignof(_type)); \ + __event_len += lttng_ust_lib_ring_buffer_align(__event_len, lttng_ust_rb_alignof(_type)); \ __dynamic_len[__dynamic_len_idx] = (_src_length); \ __event_len += sizeof(_type) * __dynamic_len[__dynamic_len_idx]; \ __dynamic_len_idx++; @@ -383,6 +448,11 @@ static void __event_probe__##_provider##___##_name(_TP_ARGS_DATA_PROTO(_args)); __event_len += __dynamic_len[__dynamic_len_idx++] = \ strlen((_src) ? (_src) : __LTTNG_UST_NULL_STRING) + 1; +#undef _ctf_unused +#define _ctf_unused(_src) \ + if (0) \ + (void) (_src); /* Unused */ + #undef _ctf_enum #define _ctf_enum(_provider, _name, _type, _item, _src, _nowrite) \ _ctf_integer_ext(_type, _item, _src, BYTE_ORDER, 10, _nowrite) @@ -393,18 +463,22 @@ static void __event_probe__##_provider##___##_name(_TP_ARGS_DATA_PROTO(_args)); #undef TP_FIELDS #define TP_FIELDS(...) __VA_ARGS__ -#undef TRACEPOINT_EVENT_CLASS -#define TRACEPOINT_EVENT_CLASS(_provider, _name, _args, _fields) \ -static inline lttng_ust_notrace \ -size_t __event_get_size__##_provider##___##_name(size_t *__dynamic_len, _TP_ARGS_DATA_PROTO(_args)); \ +#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_DATA_PROTO(_args)) \ + lttng_ust_notrace; \ +static inline \ +size_t __event_get_size__##_provider##___##_name( \ + size_t *__dynamic_len __attribute__((__unused__)), \ + _TP_ARGS_DATA_PROTO(_args)) \ { \ size_t __event_len = 0; \ - unsigned int __dynamic_len_idx = 0; \ + unsigned int __dynamic_len_idx __attribute__((__unused__)) = 0; \ \ if (0) \ - (void) __dynamic_len_idx; /* don't warn if unused */ \ + (void) __tp_data; /* don't warn if unused */ \ + \ _fields \ return __event_len; \ } @@ -425,7 +499,7 @@ size_t __event_get_size__##_provider##___##_name(size_t *__dynamic_len, _TP_ARGS #undef _ctf_integer_ext #define _ctf_integer_ext(_type, _item, _src, _byte_order, _base, _nowrite) \ - if (lttng_is_signed_type(_type)) { \ + if (lttng_ust_is_signed_type(_type)) { \ int64_t __ctf_tmp_int64; \ switch (sizeof(_type)) { \ case 1: \ @@ -543,6 +617,11 @@ size_t __event_get_size__##_provider##___##_name(size_t *__dynamic_len, _TP_ARGS __stack_data += sizeof(void *); \ } +#undef _ctf_unused +#define _ctf_unused(_src) \ + if (0) \ + (void) (_src); + #undef _ctf_enum #define _ctf_enum(_provider, _name, _type, _item, _src, _nowrite) \ _ctf_integer_ext(_type, _item, _src, BYTE_ORDER, 10, _nowrite) @@ -553,12 +632,17 @@ size_t __event_get_size__##_provider##___##_name(size_t *__dynamic_len, _TP_ARGS #undef TP_FIELDS #define TP_FIELDS(...) __VA_ARGS__ -#undef TRACEPOINT_EVENT_CLASS -#define TRACEPOINT_EVENT_CLASS(_provider, _name, _args, _fields) \ +#undef _TRACEPOINT_EVENT_CLASS +#define _TRACEPOINT_EVENT_CLASS(_provider, _name, _args, _fields) \ static inline \ -void __event_prepare_filter_stack__##_provider##___##_name(char *__stack_data,\ +void __event_prepare_interpreter_stack__##_provider##___##_name(char *__stack_data,\ _TP_ARGS_DATA_PROTO(_args)) \ { \ + if (0) { \ + (void) __tp_data; /* don't warn if unused */ \ + (void) __stack_data; /* don't warn if unused */ \ + } \ + \ _fields \ } @@ -576,25 +660,42 @@ void __event_prepare_filter_stack__##_provider##___##_name(char *__stack_data,\ #undef _ctf_integer_ext #define _ctf_integer_ext(_type, _item, _src, _byte_order, _base, _nowrite) \ - __event_align = _tp_max_t(size_t, __event_align, lttng_alignof(_type)); + if (0) \ + (void) (_src); /* Unused */ \ + __event_align = _tp_max_t(size_t, __event_align, lttng_ust_rb_alignof(_type)); #undef _ctf_float #define _ctf_float(_type, _item, _src, _nowrite) \ - __event_align = _tp_max_t(size_t, __event_align, lttng_alignof(_type)); + if (0) \ + (void) (_src); /* Unused */ \ + __event_align = _tp_max_t(size_t, __event_align, lttng_ust_rb_alignof(_type)); #undef _ctf_array_encoded #define _ctf_array_encoded(_type, _item, _src, _byte_order, _length, \ _encoding, _nowrite, _elem_type_base) \ - __event_align = _tp_max_t(size_t, __event_align, lttng_alignof(_type)); + if (0) \ + (void) (_src); /* Unused */ \ + __event_align = _tp_max_t(size_t, __event_align, lttng_ust_rb_alignof(_type)); #undef _ctf_sequence_encoded #define _ctf_sequence_encoded(_type, _item, _src, _byte_order, _length_type, \ _src_length, _encoding, _nowrite, _elem_type_base) \ - __event_align = _tp_max_t(size_t, __event_align, lttng_alignof(_length_type)); \ - __event_align = _tp_max_t(size_t, __event_align, lttng_alignof(_type)); + if (0) \ + (void) (_src); /* Unused */ \ + if (0) \ + (void) (_src_length); /* Unused */ \ + __event_align = _tp_max_t(size_t, __event_align, lttng_ust_rb_alignof(_length_type)); \ + __event_align = _tp_max_t(size_t, __event_align, lttng_ust_rb_alignof(_type)); #undef _ctf_string -#define _ctf_string(_item, _src, _nowrite) +#define _ctf_string(_item, _src, _nowrite) \ + if (0) \ + (void) (_src); /* Unused */ + +#undef _ctf_unused +#define _ctf_unused(_src) \ + if (0) \ + (void) (_src); /* Unused */ #undef _ctf_enum #define _ctf_enum(_provider, _name, _type, _item, _src, _nowrite) \ @@ -606,10 +707,11 @@ void __event_prepare_filter_stack__##_provider##___##_name(char *__stack_data,\ #undef TP_FIELDS #define TP_FIELDS(...) __VA_ARGS__ -#undef TRACEPOINT_EVENT_CLASS -#define TRACEPOINT_EVENT_CLASS(_provider, _name, _args, _fields) \ -static inline lttng_ust_notrace \ -size_t __event_get_align__##_provider##___##_name(_TP_ARGS_PROTO(_args)); \ +#undef _TRACEPOINT_EVENT_CLASS +#define _TRACEPOINT_EVENT_CLASS(_provider, _name, _args, _fields) \ +static inline \ +size_t __event_get_align__##_provider##___##_name(_TP_ARGS_PROTO(_args)) \ + lttng_ust_notrace; \ static inline \ size_t __event_get_align__##_provider##___##_name(_TP_ARGS_PROTO(_args)) \ { \ @@ -636,60 +738,48 @@ size_t __event_get_align__##_provider##___##_name(_TP_ARGS_PROTO(_args)) \ #define _ctf_integer_ext(_type, _item, _src, _byte_order, _base, _nowrite) \ { \ _type __tmp = (_src); \ - lib_ring_buffer_align_ctx(&__ctx, lttng_alignof(__tmp));\ - __chan->ops->event_write(&__ctx, &__tmp, sizeof(__tmp));\ + __chan->ops->event_write(&__ctx, &__tmp, sizeof(__tmp), lttng_ust_rb_alignof(__tmp));\ } #undef _ctf_float #define _ctf_float(_type, _item, _src, _nowrite) \ { \ _type __tmp = (_src); \ - lib_ring_buffer_align_ctx(&__ctx, lttng_alignof(__tmp));\ - __chan->ops->event_write(&__ctx, &__tmp, sizeof(__tmp));\ + __chan->ops->event_write(&__ctx, &__tmp, sizeof(__tmp), lttng_ust_rb_alignof(__tmp));\ } #undef _ctf_array_encoded #define _ctf_array_encoded(_type, _item, _src, _byte_order, _length, \ _encoding, _nowrite, _elem_type_base) \ - lib_ring_buffer_align_ctx(&__ctx, lttng_alignof(_type)); \ - __chan->ops->event_write(&__ctx, _src, sizeof(_type) * (_length)); + if (lttng_ust_string_encoding_##_encoding == lttng_ust_string_encoding_none) \ + __chan->ops->event_write(&__ctx, _src, sizeof(_type) * (_length), lttng_ust_rb_alignof(_type)); \ + else \ + __chan->ops->event_pstrcpy_pad(&__ctx, (const char *) (_src), _length); \ #undef _ctf_sequence_encoded #define _ctf_sequence_encoded(_type, _item, _src, _byte_order, _length_type, \ _src_length, _encoding, _nowrite, _elem_type_base) \ { \ _length_type __tmpl = __stackvar.__dynamic_len[__dynamic_len_idx]; \ - lib_ring_buffer_align_ctx(&__ctx, lttng_alignof(_length_type));\ - __chan->ops->event_write(&__ctx, &__tmpl, sizeof(_length_type));\ + __chan->ops->event_write(&__ctx, &__tmpl, sizeof(_length_type), lttng_ust_rb_alignof(_length_type));\ } \ - lib_ring_buffer_align_ctx(&__ctx, lttng_alignof(_type)); \ - __chan->ops->event_write(&__ctx, _src, \ - sizeof(_type) * __get_dynamic_len(dest)); - -/* - * __chan->ops->u.has_strcpy is a flag letting us know if the LTTng-UST - * tracepoint provider ABI implements event_strcpy. This dynamic check - * can be removed when the tracepoint provider ABI moves to 2. - */ -#if (LTTNG_UST_PROVIDER_MAJOR > 1) -#error "Tracepoint probe provider major version has changed. Please remove dynamic check for has_strcpy." -#endif + if (lttng_ust_string_encoding_##_encoding == lttng_ust_string_encoding_none) \ + __chan->ops->event_write(&__ctx, _src, \ + sizeof(_type) * __get_dynamic_len(dest), lttng_ust_rb_alignof(_type)); \ + else \ + __chan->ops->event_pstrcpy_pad(&__ctx, (const char *) (_src), __get_dynamic_len(dest)); \ #undef _ctf_string -#define _ctf_string(_item, _src, _nowrite) \ +#define _ctf_string(_item, _src, _nowrite) \ { \ const char *__ctf_tmp_string = \ ((_src) ? (_src) : __LTTNG_UST_NULL_STRING); \ - lib_ring_buffer_align_ctx(&__ctx, \ - lttng_alignof(*__ctf_tmp_string)); \ - if (__chan->ops->u.has_strcpy) \ - __chan->ops->event_strcpy(&__ctx, __ctf_tmp_string, \ - __get_dynamic_len(dest)); \ - else \ - __chan->ops->event_write(&__ctx, __ctf_tmp_string, \ - __get_dynamic_len(dest)); \ + __chan->ops->event_strcpy(&__ctx, __ctf_tmp_string, \ + __get_dynamic_len(dest)); \ } +#undef _ctf_unused +#define _ctf_unused(_src) #undef _ctf_enum #define _ctf_enum(_provider, _name, _type, _item, _src, _nowrite) \ @@ -728,11 +818,11 @@ size_t __event_get_align__##_provider##___##_name(_TP_ARGS_PROTO(_args)) \ #define _TP_IP_PARAM(x) (x) #else /* TP_IP_PARAM */ -#if defined(__PPC__) && !defined(__PPC64__) +#if defined(LTTNG_UST_ARCH_PPC) && !defined(LTTNG_UST_ARCH_PPC64) #define _TP_IP_PARAM(x) NULL -#else /* #if defined(__PPC__) && !defined(__PPC64__) */ +#else #define _TP_IP_PARAM(x) __builtin_return_address(0) -#endif /* #else #if defined(__PPC__) && !defined(__PPC64__) */ +#endif #endif /* TP_IP_PARAM */ @@ -743,66 +833,94 @@ size_t __event_get_align__##_provider##___##_name(_TP_ARGS_PROTO(_args)) \ * 2*sizeof(unsigned long) for all supported architectures. * Perform UNION (||) of filter runtime list. */ -#undef TRACEPOINT_EVENT_CLASS -#define TRACEPOINT_EVENT_CLASS(_provider, _name, _args, _fields) \ -static lttng_ust_notrace \ -void __event_probe__##_provider##___##_name(_TP_ARGS_DATA_PROTO(_args)); \ +#undef _TRACEPOINT_EVENT_CLASS +#define _TRACEPOINT_EVENT_CLASS(_provider, _name, _args, _fields) \ +static \ +void __event_probe__##_provider##___##_name(_TP_ARGS_DATA_PROTO(_args)) \ + lttng_ust_notrace; \ static \ void __event_probe__##_provider##___##_name(_TP_ARGS_DATA_PROTO(_args)) \ { \ - struct lttng_event *__event = (struct lttng_event *) __tp_data; \ - struct lttng_channel *__chan = __event->chan; \ - struct lttng_ust_lib_ring_buffer_ctx __ctx; \ - struct lttng_stack_ctx __lttng_ctx; \ - size_t __event_len, __event_align; \ + struct lttng_ust_event_common *__event = (struct lttng_ust_event_common *) __tp_data; \ size_t __dynamic_len_idx = 0; \ + const size_t __num_fields = _TP_ARRAY_SIZE(__event_fields___##_provider##___##_name) - 1; \ union { \ - size_t __dynamic_len[_TP_ARRAY_SIZE(__event_fields___##_provider##___##_name) - 1]; \ - char __filter_stack_data[2 * sizeof(unsigned long) * (_TP_ARRAY_SIZE(__event_fields___##_provider##___##_name) - 1)]; \ + size_t __dynamic_len[__num_fields]; \ + char __interpreter_stack_data[2 * sizeof(unsigned long) * __num_fields]; \ } __stackvar; \ int __ret; \ + bool __interpreter_stack_prepared = false; \ \ if (0) \ (void) __dynamic_len_idx; /* don't warn if unused */ \ - if (!_TP_SESSION_CHECK(session, __chan->session)) \ - return; \ - if (caa_unlikely(!CMM_ACCESS_ONCE(__chan->session->active))) \ - return; \ - if (caa_unlikely(!CMM_ACCESS_ONCE(__chan->enabled))) \ - return; \ + switch (__event->type) { \ + case LTTNG_UST_EVENT_TYPE_RECORDER: \ + { \ + struct lttng_ust_event_recorder *__event_recorder = (struct lttng_ust_event_recorder *) __event->child; \ + struct lttng_ust_channel_buffer *__chan = __event_recorder->chan; \ + struct lttng_ust_channel_common *__chan_common = __chan->parent; \ + \ + if (!_TP_SESSION_CHECK(session, __chan_common->session)) \ + return; \ + if (caa_unlikely(!CMM_ACCESS_ONCE(__chan_common->session->active))) \ + return; \ + if (caa_unlikely(!CMM_ACCESS_ONCE(__chan_common->enabled))) \ + return; \ + break; \ + } \ + case LTTNG_UST_EVENT_TYPE_NOTIFIER: \ + break; \ + } \ if (caa_unlikely(!CMM_ACCESS_ONCE(__event->enabled))) \ return; \ if (caa_unlikely(!TP_RCU_LINK_TEST())) \ return; \ - if (caa_unlikely(!cds_list_empty(&__event->bytecode_runtime_head))) { \ - struct lttng_bytecode_runtime *bc_runtime; \ - int __filter_record = __event->has_enablers_without_bytecode; \ - \ - __event_prepare_filter_stack__##_provider##___##_name(__stackvar.__filter_stack_data, \ + if (caa_unlikely(CMM_ACCESS_ONCE(__event->eval_filter))) { \ + __event_prepare_interpreter_stack__##_provider##___##_name(__stackvar.__interpreter_stack_data, \ _TP_ARGS_DATA_VAR(_args)); \ - tp_list_for_each_entry_rcu(bc_runtime, &__event->bytecode_runtime_head, node) { \ - if (caa_unlikely(bc_runtime->filter(bc_runtime, \ - __stackvar.__filter_stack_data) & LTTNG_FILTER_RECORD_FLAG)) \ - __filter_record = 1; \ - } \ - if (caa_likely(!__filter_record)) \ + __interpreter_stack_prepared = true; \ + if (caa_likely(__event->run_filter(__event, \ + __stackvar.__interpreter_stack_data, NULL) != LTTNG_UST_EVENT_FILTER_ACCEPT)) \ return; \ } \ - __event_len = __event_get_size__##_provider##___##_name(__stackvar.__dynamic_len, \ - _TP_ARGS_DATA_VAR(_args)); \ - __event_align = __event_get_align__##_provider##___##_name(_TP_ARGS_VAR(_args)); \ - memset(&__lttng_ctx, 0, sizeof(__lttng_ctx)); \ - __lttng_ctx.event = __event; \ - __lttng_ctx.chan_ctx = tp_rcu_dereference_bp(__chan->ctx); \ - __lttng_ctx.event_ctx = tp_rcu_dereference_bp(__event->ctx); \ - lib_ring_buffer_ctx_init(&__ctx, __chan->chan, __event, __event_len, \ - __event_align, -1, __chan->handle, &__lttng_ctx); \ - __ctx.ip = _TP_IP_PARAM(TP_IP_PARAM); \ - __ret = __chan->ops->event_reserve(&__ctx, __event->id); \ - if (__ret < 0) \ - return; \ - _fields \ - __chan->ops->event_commit(&__ctx); \ + switch (__event->type) { \ + case LTTNG_UST_EVENT_TYPE_RECORDER: \ + { \ + size_t __event_len, __event_align; \ + struct lttng_ust_event_recorder *__event_recorder = (struct lttng_ust_event_recorder *) __event->child; \ + struct lttng_ust_channel_buffer *__chan = __event_recorder->chan; \ + struct lttng_ust_lib_ring_buffer_ctx __ctx; \ + \ + __event_len = __event_get_size__##_provider##___##_name(__stackvar.__dynamic_len, \ + _TP_ARGS_DATA_VAR(_args)); \ + __event_align = __event_get_align__##_provider##___##_name(_TP_ARGS_VAR(_args)); \ + lttng_ust_lib_ring_buffer_ctx_init(&__ctx, __event_recorder, __event_len, __event_align, \ + _TP_IP_PARAM(TP_IP_PARAM)); \ + __ret = __chan->ops->event_reserve(&__ctx); \ + if (__ret < 0) \ + return; \ + _fields \ + __chan->ops->event_commit(&__ctx); \ + break; \ + } \ + case LTTNG_UST_EVENT_TYPE_NOTIFIER: \ + { \ + struct lttng_ust_event_notifier *__event_notifier = (struct lttng_ust_event_notifier *) __event->child; \ + struct lttng_ust_notification_ctx __notif_ctx; \ + \ + __notif_ctx.struct_size = sizeof(struct lttng_ust_notification_ctx); \ + __notif_ctx.eval_capture = CMM_ACCESS_ONCE(__event_notifier->eval_capture); \ + \ + if (caa_unlikely(!__interpreter_stack_prepared && __notif_ctx.eval_capture)) \ + __event_prepare_interpreter_stack__##_provider##___##_name(__stackvar.__interpreter_stack_data, \ + _TP_ARGS_DATA_VAR(_args)); \ + \ + __event_notifier->notification_send(__event_notifier, \ + __stackvar.__interpreter_stack_data, \ + &__notif_ctx); \ + break; \ + } \ + } \ } #include TRACEPOINT_INCLUDE @@ -823,8 +941,8 @@ void __event_probe__##_provider##___##_name(_TP_ARGS_DATA_PROTO(_args)) \ #define _TP_EXTRACT_STRING2(...) #__VA_ARGS__ -#undef TRACEPOINT_EVENT_CLASS -#define TRACEPOINT_EVENT_CLASS(_provider, _name, _args, _fields) \ +#undef _TRACEPOINT_EVENT_CLASS +#define _TRACEPOINT_EVENT_CLASS(_provider, _name, _args, _fields) \ static const char __tp_event_signature___##_provider##___##_name[] = \ _TP_EXTRACT_STRING2(_args); @@ -865,9 +983,7 @@ LTTNG_TP_EXTERN_C const int *_loglevel___##__provider##___##__name \ #include TRACEPOINT_INCLUDE -#ifdef __cplusplus #undef LTTNG_TP_EXTERN_C -#endif /* * Stage 6.1 of tracepoint event generation. @@ -893,13 +1009,24 @@ LTTNG_TP_EXTERN_C const int *_loglevel___##__provider##___##__name \ #undef TRACEPOINT_MODEL_EMF_URI #define TRACEPOINT_MODEL_EMF_URI(__provider, __name, __uri) \ LTTNG_TP_EXTERN_C const char *_model_emf_uri___##__provider##___##__name \ - __attribute__((visibility("hidden"))) = __uri \ + __attribute__((visibility("hidden"))) = __uri; \ #include TRACEPOINT_INCLUDE -#ifdef __cplusplus #undef LTTNG_TP_EXTERN_C -#endif + +/* + * Stage 7.0 of tracepoint event generation. + * + * Declare toplevel descriptor for the whole probe. + * Unlike C, C++ does not allow tentative definitions. Therefore, we + * need to explicitly declare the variable with "extern", using hidden + * visibility to keep this symbol from being exported to the global + * symbol table. + */ + +extern const struct lttng_ust_probe_desc _TP_COMBINE_TOKENS(__probe_desc___, TRACEPOINT_PROVIDER) + __attribute__((visibility("hidden"))); /* * Stage 7.1 of tracepoint event generation. @@ -912,27 +1039,24 @@ LTTNG_TP_EXTERN_C const char *_model_emf_uri___##__provider##___##__name \ /* Reset all macros within TRACEPOINT_EVENT */ #include -#undef TRACEPOINT_EVENT_INSTANCE -#define TRACEPOINT_EVENT_INSTANCE(_provider, _template, _name, _args) \ +#undef _TRACEPOINT_EVENT_INSTANCE +#define _TRACEPOINT_EVENT_INSTANCE(_provider, _template, _name, _args) \ static const int * \ __ref_loglevel___##_provider##___##_name \ __attribute__((weakref ("_loglevel___" #_provider "___" #_name))); \ static const char * \ __ref_model_emf_uri___##_provider##___##_name \ __attribute__((weakref ("_model_emf_uri___" #_provider "___" #_name)));\ -static const struct lttng_event_desc __event_desc___##_provider##_##_name = { \ - .name = #_provider ":" #_name, \ - .probe_callback = (void (*)(void)) &__event_probe__##_provider##___##_template,\ - .ctx = NULL, \ +static const struct lttng_ust_event_desc __event_desc___##_provider##_##_name = { \ + .struct_size = sizeof(struct lttng_ust_event_desc), \ + .event_name = #_name, \ + .probe_desc = &__probe_desc___##_provider, \ + .probe_callback = (void (*)(void)) &__event_probe__##_provider##___##_template, \ .fields = __event_fields___##_provider##___##_template, \ .nr_fields = _TP_ARRAY_SIZE(__event_fields___##_provider##___##_template) - 1, \ .loglevel = &__ref_loglevel___##_provider##___##_name, \ .signature = __tp_event_signature___##_provider##___##_template, \ - .u = { \ - .ext = { \ - .model_emf_uri = &__ref_model_emf_uri___##_provider##___##_name, \ - }, \ - }, \ + .model_emf_uri = &__ref_model_emf_uri___##_provider##___##_name, \ }; #include TRACEPOINT_INCLUDE @@ -946,11 +1070,11 @@ static const struct lttng_event_desc __event_desc___##_provider##_##_name = { /* Reset all macros within TRACEPOINT_EVENT */ #include -#undef TRACEPOINT_EVENT_INSTANCE -#define TRACEPOINT_EVENT_INSTANCE(_provider, _template, _name, _args) \ +#undef _TRACEPOINT_EVENT_INSTANCE +#define _TRACEPOINT_EVENT_INSTANCE(_provider, _template, _name, _args) \ &__event_desc___##_provider##_##_name, -static const struct lttng_event_desc *_TP_COMBINE_TOKENS(__event_desc___, TRACEPOINT_PROVIDER)[] = { +static const struct lttng_ust_event_desc *_TP_COMBINE_TOKENS(__event_desc___, TRACEPOINT_PROVIDER)[] = { #include TRACEPOINT_INCLUDE NULL, /* Dummy, C99 forbids 0-len array. */ }; @@ -962,19 +1086,17 @@ static const struct lttng_event_desc *_TP_COMBINE_TOKENS(__event_desc___, TRACEP * Create a toplevel descriptor for the whole probe. */ -/* non-const because list head will be modified when registered. */ -static struct lttng_probe_desc _TP_COMBINE_TOKENS(__probe_desc___, TRACEPOINT_PROVIDER) = { - .provider = __tp_stringify(TRACEPOINT_PROVIDER), +const struct lttng_ust_probe_desc _TP_COMBINE_TOKENS(__probe_desc___, TRACEPOINT_PROVIDER) = { + .struct_size = sizeof(struct lttng_ust_probe_desc), + .provider_name = __tp_stringify(TRACEPOINT_PROVIDER), .event_desc = _TP_COMBINE_TOKENS(__event_desc___, TRACEPOINT_PROVIDER), .nr_events = _TP_ARRAY_SIZE(_TP_COMBINE_TOKENS(__event_desc___, TRACEPOINT_PROVIDER)) - 1, - .head = { NULL, NULL }, - .lazy_init_head = { NULL, NULL }, - .lazy = 0, .major = LTTNG_UST_PROVIDER_MAJOR, .minor = LTTNG_UST_PROVIDER_MINOR, }; static int _TP_COMBINE_TOKENS(__probe_register_refcount___, TRACEPOINT_PROVIDER); +static struct lttng_ust_registered_probe *_TP_COMBINE_TOKENS(__lttng_ust_probe_register_cookie___, TRACEPOINT_PROVIDER); /* * Stage 9 of tracepoint event generation. @@ -989,12 +1111,13 @@ static int _TP_COMBINE_TOKENS(__probe_register_refcount___, TRACEPOINT_PROVIDER) /* Reset all macros within TRACEPOINT_EVENT */ #include -static void lttng_ust_notrace __attribute__((constructor)) -_TP_COMBINE_TOKENS(__lttng_events_init__, TRACEPOINT_PROVIDER)(void); +static void +_TP_COMBINE_TOKENS(__lttng_events_init__, TRACEPOINT_PROVIDER)(void) + lttng_ust_notrace __attribute__((constructor)); static void _TP_COMBINE_TOKENS(__lttng_events_init__, TRACEPOINT_PROVIDER)(void) { - int ret; + struct lttng_ust_registered_probe *reg_probe; if (_TP_COMBINE_TOKENS(__probe_register_refcount___, TRACEPOINT_PROVIDER)++) { @@ -1009,15 +1132,18 @@ _TP_COMBINE_TOKENS(__lttng_events_init__, TRACEPOINT_PROVIDER)(void) * error will appear. */ _TP_COMBINE_TOKENS(__tracepoint_provider_check_, TRACEPOINT_PROVIDER)(); - ret = lttng_probe_register(&_TP_COMBINE_TOKENS(__probe_desc___, TRACEPOINT_PROVIDER)); - if (ret) { - fprintf(stderr, "LTTng-UST: Error (%d) while registering tracepoint probe. Duplicate registration of tracepoint probes having the same name is not allowed.\n", ret); + assert(!_TP_COMBINE_TOKENS(__lttng_ust_probe_register_cookie___, TRACEPOINT_PROVIDER)); + reg_probe = lttng_ust_probe_register(&_TP_COMBINE_TOKENS(__probe_desc___, TRACEPOINT_PROVIDER)); + if (!reg_probe) { + fprintf(stderr, "LTTng-UST: Error while registering tracepoint probe.\n"); abort(); } + _TP_COMBINE_TOKENS(__lttng_ust_probe_register_cookie___, TRACEPOINT_PROVIDER) = reg_probe; } -static void lttng_ust_notrace __attribute__((destructor)) -_TP_COMBINE_TOKENS(__lttng_events_exit__, TRACEPOINT_PROVIDER)(void); +static void +_TP_COMBINE_TOKENS(__lttng_events_exit__, TRACEPOINT_PROVIDER)(void) + lttng_ust_notrace __attribute__((destructor)); static void _TP_COMBINE_TOKENS(__lttng_events_exit__, TRACEPOINT_PROVIDER)(void) { @@ -1025,7 +1151,9 @@ _TP_COMBINE_TOKENS(__lttng_events_exit__, TRACEPOINT_PROVIDER)(void) TRACEPOINT_PROVIDER)) { return; } - lttng_probe_unregister(&_TP_COMBINE_TOKENS(__probe_desc___, TRACEPOINT_PROVIDER)); + lttng_ust_probe_unregister(_TP_COMBINE_TOKENS(__lttng_ust_probe_register_cookie___, TRACEPOINT_PROVIDER)); + _TP_COMBINE_TOKENS(__lttng_ust_probe_register_cookie___, TRACEPOINT_PROVIDER) = NULL; } -int _TP_COMBINE_TOKENS(__tracepoint_provider_, TRACEPOINT_PROVIDER); +int _TP_COMBINE_TOKENS(__tracepoint_provider_, TRACEPOINT_PROVIDER) + __attribute__((visibility("default")));