Clarify probe registration documentation/errors
[lttng-ust.git] / include / lttng / ust-tracepoint-event.h
index fdecda706b5f0c81a61cc03ace4ba51826015e7d..777913aa58dc884f3557b7e027046f4d8bf8439b 100644 (file)
  *
  * 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.
  */
 
 #include <stdio.h>
+#include <stdlib.h>
 #include <urcu/compiler.h>
 #include <urcu/rculist.h>
 #include <lttng/ust-events.h>
 #include <lttng/ringbuffer-config.h>
 #include <lttng/ust-compiler.h>
+#include <lttng/tracepoint.h>
 #include <string.h>
 
+#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);       \
+            &pos->member != (head);                                    \
+            pos = cds_list_entry(tp_rcu_dereference_bp(pos->member.next), __typeof__(*pos), member))
+
 /*
  * TRACEPOINT_EVENT_CLASS declares a class of tracepoints receiving the
  * same arguments and having the same field layout.
@@ -72,7 +88,7 @@ void _TP_COMBINE_TOKENS(__tracepoint_provider_mismatch_, TRACEPOINT_PROVIDER)(vo
 #define TRACEPOINT_EVENT_INSTANCE(_provider, _template, _name, _args)  \
        __tracepoint_provider_mismatch_##_provider();
 
-static __attribute__((unused))
+static inline
 void _TP_COMBINE_TOKENS(__tracepoint_provider_check_, TRACEPOINT_PROVIDER)(void)
 {
 #include TRACEPOINT_INCLUDE
@@ -132,11 +148,14 @@ static const char                                                 \
          .type =                                               \
                {                                               \
                  .atype = atype_array,                         \
-                 .u.array =                                    \
+                 .u =                                          \
                        {                                       \
-                           .length = _length,                  \
-                           .elem_type = __type_integer(_type, BYTE_ORDER, 10, _encoding), \
-                       },                                      \
+                         .array =                              \
+                               {                               \
+                                 .elem_type = __type_integer(_type, BYTE_ORDER, 10, _encoding), \
+                                 .length = _length,            \
+                               }                               \
+                       }                                       \
                },                                              \
          .nowrite = _nowrite,                                  \
        },
@@ -149,10 +168,13 @@ static const char                                                 \
          .type =                                               \
                {                                               \
                  .atype = atype_sequence,                      \
-                 .u.sequence =                                 \
+                 .u =                                          \
                        {                                       \
-                           .length_type = __type_integer(_length_type, BYTE_ORDER, 10, none), \
-                           .elem_type = __type_integer(_type, BYTE_ORDER, 10, _encoding), \
+                         .sequence =                           \
+                               {                               \
+                                 .length_type = __type_integer(_length_type, BYTE_ORDER, 10, none), \
+                                 .elem_type = __type_integer(_type, BYTE_ORDER, 10, _encoding), \
+                               },                              \
                        },                                      \
                },                                              \
          .nowrite = _nowrite,                                  \
@@ -165,7 +187,10 @@ static const char                                                  \
          .type =                                               \
                {                                               \
                  .atype = atype_string,                        \
-                 .u.basic.string.encoding = lttng_encode_UTF8, \
+                 .u =                                          \
+                       {                                       \
+                         .basic = { .string = { .encoding = lttng_encode_UTF8 } } \
+                       },                                      \
                },                                              \
          .nowrite = _nowrite,                                  \
        },
@@ -468,7 +493,7 @@ void __event_probe__##_provider##___##_name(_TP_ARGS_DATA_PROTO(_args));      \
 static                                                                       \
 void __event_probe__##_provider##___##_name(_TP_ARGS_DATA_PROTO(_args))              \
 {                                                                            \
-       struct lttng_event *__event = __tp_data;                              \
+       struct lttng_event *__event = (struct lttng_event *) __tp_data;                       \
        struct lttng_channel *__chan = __event->chan;                         \
        struct lttng_ust_lib_ring_buffer_ctx __ctx;                           \
        size_t __event_len, __event_align;                                    \
@@ -487,18 +512,20 @@ void __event_probe__##_provider##___##_name(_TP_ARGS_DATA_PROTO(_args))         \
                return;                                                       \
        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_result = 0;                                      \
+               int __filter_record = __event->has_enablers_without_bytecode; \
                                                                              \
                __event_prepare_filter_stack__##_provider##___##_name(__stackvar.__filter_stack_data, \
                        _TP_ARGS_DATA_VAR(_args));                            \
-               cds_list_for_each_entry_rcu(bc_runtime, &__event->bytecode_runtime_head, node) { \
+               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)))     \
-                               __filter_result = 1;                          \
+                                       __stackvar.__filter_stack_data) & LTTNG_FILTER_RECORD_FLAG)) \
+                               __filter_record = 1;                          \
                }                                                             \
-               if (caa_likely(!__filter_result))                             \
+               if (caa_likely(!__filter_record))                             \
                        return;                                               \
        }                                                                     \
        __event_len = __event_get_size__##_provider##___##_name(__stackvar.__dynamic_len, \
@@ -595,13 +622,14 @@ static const char *                                                              \
        __ref_model_emf_uri___##_provider##___##_name                          \
        __attribute__((weakref ("_model_emf_uri___" #_provider "___" #_name)));\
 const struct lttng_event_desc __event_desc___##_provider##_##_name = {        \
-       .fields = __event_fields___##_provider##___##_template,                \
        .name = #_provider ":" #_name,                                         \
        .probe_callback = (void (*)(void)) &__event_probe__##_provider##___##_template,\
+       .ctx = NULL,                                                           \
+       .fields = __event_fields___##_provider##___##_template,                \
        .nr_fields = _TP_ARRAY_SIZE(__event_fields___##_provider##___##_template), \
        .loglevel = &__ref_loglevel___##_provider##___##_name,                 \
        .signature = __tp_event_signature___##_provider##___##_template,       \
-       .u.ext.model_emf_uri = &__ref_model_emf_uri___##_provider##___##_name, \
+       .u = { .ext = { .model_emf_uri = &__ref_model_emf_uri___##_provider##___##_name } }, \
 };
 
 #include TRACEPOINT_INCLUDE
@@ -635,6 +663,11 @@ static struct lttng_probe_desc _TP_COMBINE_TOKENS(__probe_desc___, TRACEPOINT_PR
        .provider = __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)),
+       .head = { NULL, NULL },
+       .lazy_init_head = { NULL, NULL },
+       .lazy = 0,
+       .major = LTTNG_UST_PROVIDER_MAJOR,
+       .minor = LTTNG_UST_PROVIDER_MINOR,
 };
 
 /*
@@ -655,8 +688,20 @@ _TP_COMBINE_TOKENS(__lttng_events_init__, TRACEPOINT_PROVIDER)(void)
 {
        int ret;
 
+       /*
+        * __tracepoint_provider_check_ ## TRACEPOINT_PROVIDER() is a
+        * static inline function that ensures every probe PROVIDER
+        * argument match the provider within which they appear. It
+        * calls empty static inline functions, and therefore has no
+        * runtime effect. However, if it detects an error, a linker
+        * error will appear.
+        */
+       _TP_COMBINE_TOKENS(__tracepoint_provider_check_, TRACEPOINT_PROVIDER)();
        ret = lttng_probe_register(&_TP_COMBINE_TOKENS(__probe_desc___, TRACEPOINT_PROVIDER));
-       assert(!ret);
+       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);
+               abort();
+       }
 }
 
 static void lttng_ust_notrace __attribute__((destructor))
This page took 0.025623 seconds and 4 git commands to generate.