#include "lttng-probe-user.h"
#include "../wrapper/vmalloc.h" /* for wrapper_vmalloc_sync_all() */
#include "../wrapper/ringbuffer/frontend_types.h"
+#include "../wrapper/rcu.h"
#include "../lttng-events.h"
#include "../lttng-tracer-core.h"
#undef LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP_NOARGS
#define LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP_NOARGS(_template, _name, _map) \
-void trace_##_name(void *__data);
+void trace_##_name(void);
+
+#include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
+
+/*
+ * Stage 1.1 of the trace events.
+ *
+ * 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.
+ */
+
+#include "lttng-events-reset.h" /* Reset all macros within TRACE_EVENT */
+
+#undef TP_PROTO
+#define TP_PROTO(...) __VA_ARGS__
+
+#undef TP_ARGS
+#define TP_ARGS(...) __VA_ARGS__
+
+#undef LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP
+#define LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP(_template, _name, _map, _proto, _args) \
+void __event_template_proto___##_template(_proto);
+
+#undef LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP_NOARGS
+#define LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP_NOARGS(_template, _name, _map) \
+void __event_template_proto___##_template(void);
+
+#undef LTTNG_TRACEPOINT_EVENT_CLASS_CODE
+#define LTTNG_TRACEPOINT_EVENT_CLASS_CODE(_name, _proto, _args, _locvar, _code, _fields) \
+void __event_template_proto___##_name(_proto);
+
+#undef LTTNG_TRACEPOINT_EVENT_CLASS_CODE_NOARGS
+#define LTTNG_TRACEPOINT_EVENT_CLASS_CODE_NOARGS(_name, _locvar, _code, _fields) \
+void __event_template_proto___##_name(void);
#include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
#undef _ctf_sequence_encoded
#define _ctf_sequence_encoded(_type, _item, _src, \
_length_type, _src_length, _encoding, \
- _base, _user, _nowrite) \
+ _byte_order, _base, _user, _nowrite) \
{ \
.name = #_item, \
.type = \
.sequence = \
{ \
.length_type = __type_integer(_length_type, __BYTE_ORDER, 10, none), \
- .elem_type = __type_integer(_type, __BYTE_ORDER, _base, _encoding), \
+ .elem_type = __type_integer(_type, _byte_order, _base, _encoding), \
}, \
}, \
}, \
#undef _ctf_sequence_encoded
#define _ctf_sequence_encoded(_type, _item, _src, _length_type, \
- _src_length, _encoding, _base, _user, _nowrite) \
+ _src_length, _encoding, _byte_order, _base, _user, _nowrite) \
__event_len += lib_ring_buffer_align(__event_len, lttng_alignof(_length_type)); \
__event_len += sizeof(_length_type); \
__event_len += lib_ring_buffer_align(__event_len, lttng_alignof(_type)); \
#define _ctf_string(_item, _src, _user, _nowrite) \
if (_user) \
__event_len += __dynamic_len[__dynamic_len_idx++] = \
- strlen(_src) + 1; \
+ max_t(size_t, lttng_strlen_user_inatomic(_src), 1); \
else \
__event_len += __dynamic_len[__dynamic_len_idx++] = \
- max_t(size_t, lttng_strlen_user_inatomic(_src), 1);
+ strlen(_src) + 1;
#undef TP_PROTO
#define TP_PROTO(...) __VA_ARGS__
const void *__ctf_tmp_ptr = (_src); \
memcpy(__stack_data, &__ctf_tmp_ulong, sizeof(unsigned long)); \
__stack_data += sizeof(unsigned long); \
- memcpy(__stack_data, &__ctf_tmp_ptr, sizeof(void **)); \
- __stack_data += sizeof(void **); \
+ memcpy(__stack_data, &__ctf_tmp_ptr, sizeof(void *)); \
+ __stack_data += sizeof(void *); \
}
#undef _ctf_sequence_encoded
#define _ctf_sequence_encoded(_type, _item, _src, _length_type, \
- _src_length, _encoding, _base, _user, _nowrite) \
+ _src_length, _encoding, _byte_order, _base, _user, _nowrite) \
{ \
unsigned long __ctf_tmp_ulong = (unsigned long) (_src_length); \
const void *__ctf_tmp_ptr = (_src); \
memcpy(__stack_data, &__ctf_tmp_ulong, sizeof(unsigned long)); \
__stack_data += sizeof(unsigned long); \
- memcpy(__stack_data, &__ctf_tmp_ptr, sizeof(void **)); \
- __stack_data += sizeof(void **); \
+ memcpy(__stack_data, &__ctf_tmp_ptr, sizeof(void *)); \
+ __stack_data += sizeof(void *); \
}
#undef _ctf_string
#define _ctf_string(_item, _src, _user, _nowrite) \
{ \
const void *__ctf_tmp_ptr = (_src); \
- memcpy(__stack_data, &__ctf_tmp_ptr, sizeof(void **)); \
- __stack_data += sizeof(void **); \
+ memcpy(__stack_data, &__ctf_tmp_ptr, sizeof(void *)); \
+ __stack_data += sizeof(void *); \
}
#undef TP_PROTO
#undef _ctf_sequence_encoded
#define _ctf_sequence_encoded(_type, _item, _src, _length_type, \
- _src_length, _encoding, _base, _user, _nowrite) \
+ _src_length, _encoding, _byte_order, _base, _user, _nowrite) \
__event_align = max_t(size_t, __event_align, lttng_alignof(_length_type)); \
__event_align = max_t(size_t, __event_align, lttng_alignof(_type));
#undef _ctf_sequence_encoded
#define _ctf_sequence_encoded(_type, _item, _src, _length_type, \
- _src_length, _encoding, _base, _user, _nowrite) \
+ _src_length, _encoding, _byte_order, _base, _user, _nowrite) \
{ \
_length_type __tmpl = __stackvar.__dynamic_len[__dynamic_len_idx]; \
lib_ring_buffer_align_ctx(&__ctx, lttng_alignof(_length_type));\
return; \
if (unlikely(!ACCESS_ONCE(__event->enabled))) \
return; \
- __lpf = rcu_dereference(__session->pid_tracker); \
+ __lpf = lttng_rcu_dereference(__session->pid_tracker); \
if (__lpf && likely(!lttng_pid_tracker_lookup(__lpf, current->pid))) \
return; \
_code \
\
__event_prepare_filter_stack__##_name(__stackvar.__filter_stack_data, \
tp_locvar, _args); \
- list_for_each_entry_rcu(bc_runtime, &__event->bytecode_runtime_head, node) { \
+ lttng_list_for_each_entry_rcu(bc_runtime, &__event->bytecode_runtime_head, node) { \
if (unlikely(bc_runtime->filter(bc_runtime, \
__stackvar.__filter_stack_data) & LTTNG_FILTER_RECORD_FLAG)) \
__filter_record = 1; \
return; \
if (unlikely(!ACCESS_ONCE(__event->enabled))) \
return; \
- __lpf = rcu_dereference(__session->pid_tracker); \
+ __lpf = lttng_rcu_dereference(__session->pid_tracker); \
if (__lpf && likely(!lttng_pid_tracker_lookup(__lpf, current->pid))) \
return; \
_code \
\
__event_prepare_filter_stack__##_name(__stackvar.__filter_stack_data, \
tp_locvar); \
- list_for_each_entry_rcu(bc_runtime, &__event->bytecode_runtime_head, node) { \
+ lttng_list_for_each_entry_rcu(bc_runtime, &__event->bytecode_runtime_head, node) { \
if (unlikely(bc_runtime->filter(bc_runtime, \
__stackvar.__filter_stack_data) & LTTNG_FILTER_RECORD_FLAG)) \
__filter_record = 1; \