+/*
+ * lttng-events.h
+ *
+ * Copyright (C) 2009 Steven Rostedt <rostedt@goodmis.org>
+ * Copyright (C) 2010-2011 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+ *
+ * Dual LGPL v2.1/GPL v2 license.
+ */
+
#include <linux/debugfs.h>
#include "lttng.h"
#include "lttng-types.h"
#define __field(_type, _item) \
{ \
.name = #_item, \
- .type = __type_integer(_type, __BYTE_ORDER), \
+ .type = __type_integer(_type, __BYTE_ORDER, 10, none),\
},
#undef __field_ext
#define __field_network(_type, _item) \
{ \
.name = #_item, \
- .type = __type_integer(_type, __BIG_ENDIAN), \
+ .type = __type_integer(_type, __BIG_ENDIAN, 10, none),\
},
-#undef __array
-#define __array(_type, _item, _length) \
+#undef __array_enc
+#define __array_enc(_type, _item, _length, _encoding) \
{ \
.name = #_item, \
.type = \
.u.array = \
{ \
.length = _length, \
- .elem_type = __type_integer(_type, __BYTE_ORDER), \
+ .elem_type = __type_integer(_type, __BYTE_ORDER, 10, _encoding), \
}, \
}, \
},
-#undef __dynamic_array
-#define __dynamic_array(_type, _item, _length) \
+#undef __array
+#define __array(_type, _item, _length) \
+ __array_enc(_type, _item, _length, none)
+
+#undef __array_text
+#define __array_text(_type, _item, _length) \
+ __array_enc(_type, _item, _length, UTF8)
+
+#undef __dynamic_array_enc
+#define __dynamic_array_enc(_type, _item, _length, _encoding) \
{ \
.name = #_item, \
.type = \
.atype = atype_sequence, \
.u.sequence = \
{ \
- .length_type = __type_integer(u32, __BYTE_ORDER), \
- .elem_type = __type_integer(_type, __BYTE_ORDER), \
+ .length_type = __type_integer(u32, __BYTE_ORDER, 10, none), \
+ .elem_type = __type_integer(_type, __BYTE_ORDER, 10, _encoding), \
}, \
}, \
},
+#undef __dynamic_array
+#define __dynamic_array(_type, _item, _length) \
+ __dynamic_array_enc(_type, _item, _length, none)
+
+#undef __dynamic_array_text
+#define __dynamic_array_text(_type, _item, _length) \
+ __dynamic_array_enc(_type, _item, _length, UTF8)
+
#undef __string
#define __string(_item, _src) \
{ \
.name = #_name, \
.probe_callback = (void *) &__event_probe__##_template,\
.nr_fields = ARRAY_SIZE(__event_fields___##_template), \
+ .owner = THIS_MODULE, \
},
#define TP_ID1(_token, _system) _token##_system
#undef __field
#define __field(_type, _item) \
- __event_len += lib_ring_buffer_align(__event_len, __alignof__(_type)); \
+ __event_len += lib_ring_buffer_align(__event_len, ltt_alignof(_type)); \
__event_len += sizeof(_type);
#undef __field_ext
#undef __array
#define __array(_type, _item, _length) \
- __event_len += lib_ring_buffer_align(__event_len, __alignof__(_type)); \
+ __event_len += lib_ring_buffer_align(__event_len, ltt_alignof(_type)); \
__event_len += sizeof(_type) * (_length);
+#undef __array_text
+#define __array_text(_type, _item, _length) \
+ __array(_type, _item, _length)
+
#undef __dynamic_array
#define __dynamic_array(_type, _item, _length) \
- __event_len += lib_ring_buffer_align(__event_len, __alignof__(u32)); \
+ __event_len += lib_ring_buffer_align(__event_len, ltt_alignof(u32)); \
__event_len += sizeof(u32); \
- __event_len += lib_ring_buffer_align(__event_len, __alignof__(_type)); \
- __event_len += sizeof(_type) * (_length);
+ __event_len += lib_ring_buffer_align(__event_len, ltt_alignof(_type)); \
+ __dynamic_len[__dynamic_len_idx] = (_length); \
+ __event_len += sizeof(_type) * __dynamic_len[__dynamic_len_idx]; \
+ __dynamic_len_idx++;
+
+#undef __dynamic_array_text
+#define __dynamic_array_text(_type, _item, _length) \
+ __dynamic_array(_type, _item, _length)
#undef __string
#define __string(_item, _src) \
#undef __field
#define __field(_type, _item) \
- __event_align = max_t(size_t, __event_align, __alignof__(_type));
+ __event_align = max_t(size_t, __event_align, ltt_alignof(_type));
#undef __field_ext
#define __field_ext(_type, _item, _filter_type) __field(_type, _item)
#undef __array
#define __array(_type, _item, _length) \
- __event_align = max_t(size_t, __event_align, __alignof__(_type));
+ __event_align = max_t(size_t, __event_align, ltt_alignof(_type));
+
+#undef __array_text
+#define __array_text(_type, _item, _length) \
+ __array(_type, _item, _length)
#undef __dynamic_array
#define __dynamic_array(_type, _item, _length) \
- __event_align = max_t(size_t, __event_align, __alignof__(u32)); \
- __event_align = max_t(size_t, __event_align, __alignof__(_type));
+ __event_align = max_t(size_t, __event_align, ltt_alignof(u32)); \
+ __event_align = max_t(size_t, __event_align, ltt_alignof(_type));
+
+#undef __dynamic_array_text
+#define __dynamic_array_text(_type, _item, _length) \
+ __dynamic_array(_type, _item, _length)
#undef __string
#define __string(_item, _src)
#undef __array
#define __array(_type, _item, _length) _type _item;
+#undef __array_text
+#define __array_text(_type, _item, _length) \
+ __array(_type, _item, _length)
+
#undef __dynamic_array
#define __dynamic_array(_type, _item, _length) _type _item;
+#undef __dynamic_array_text
+#define __dynamic_array_text(_type, _item, _length) \
+ __dynamic_array(_type, _item, _length)
+
#undef __string
#define __string(_item, _src) char _item;
goto __assign_##_item; \
__end_field_##_item:
+#undef __array_text
+#define __array_text(_type, _item, _length) \
+ __array(_type, _item, _length)
+
#undef __dynamic_array
#define __dynamic_array(_type, _item, _length) \
goto __assign_##_item##_1; \
goto __assign_##_item##_2; \
__end_field_##_item##_2:
+#undef __dynamic_array_text
+#define __dynamic_array_text(_type, _item, _length) \
+ __dynamic_array(_type, _item, _length)
+
#undef __string
#define __string(_item, _src) \
goto __assign_##_item; \
__assign_##dest: \
{ \
__typeof__(__typemap.dest) __tmp = (src); \
- lib_ring_buffer_align_ctx(&ctx, __alignof__(__tmp)); \
+ lib_ring_buffer_align_ctx(&ctx, ltt_alignof(__tmp)); \
__chan->ops->event_write(&ctx, &__tmp, sizeof(__tmp)); \
} \
goto __end_field_##dest;
#undef tp_memcpy
#define tp_memcpy(dest, src, len) \
__assign_##dest: \
- lib_ring_buffer_align_ctx(&ctx, __alignof__(__typemap.dest)); \
+ if (0) \
+ (void) __typemap.dest; \
+ lib_ring_buffer_align_ctx(&ctx, ltt_alignof(__typemap.dest)); \
__chan->ops->event_write(&ctx, src, len); \
goto __end_field_##dest;
#undef tp_memcpy_dyn
-#define tp_memcpy_dyn(dest, src, len) \
+#define tp_memcpy_dyn(dest, src) \
__assign_##dest##_1: \
{ \
- u32 __tmpl = (len); \
- lib_ring_buffer_align_ctx(&ctx, __alignof__(u32)); \
+ u32 __tmpl = __dynamic_len[__dynamic_len_idx]; \
+ lib_ring_buffer_align_ctx(&ctx, ltt_alignof(u32)); \
__chan->ops->event_write(&ctx, &__tmpl, sizeof(u32)); \
} \
goto __end_field_##dest##_1; \
__assign_##dest##_2: \
- lib_ring_buffer_align_ctx(&ctx, __alignof__(__typemap.dest)); \
- __chan->ops->event_write(&ctx, src, len); \
+ lib_ring_buffer_align_ctx(&ctx, ltt_alignof(__typemap.dest)); \
+ __chan->ops->event_write(&ctx, src, \
+ sizeof(__typemap.dest) * __get_dynamic_array_len(dest));\
goto __end_field_##dest##_2;
#undef tp_strcpy
\
if (0) \
(void) __dynamic_len_idx; /* don't warn if unused */ \
- if (!ACCESS_ONCE(__chan->session->active)) \
+ if (unlikely(!ACCESS_ONCE(__chan->session->active))) \
+ return; \
+ if (unlikely(!ACCESS_ONCE(__chan->enabled))) \
+ return; \
+ if (unlikely(!ACCESS_ONCE(__event->enabled))) \
return; \
__event_len = __event_get_size__##_name(__dynamic_len, _args); \
__event_align = __event_get_align__##_name(_args); \
- lib_ring_buffer_ctx_init(&ctx, __chan->chan, NULL, __event_len, \
+ lib_ring_buffer_ctx_init(&ctx, __chan->chan, __event, __event_len, \
__event_align, -1); \
- __ret = __chan->ops->event_reserve(&ctx); \
+ __ret = __chan->ops->event_reserve(&ctx, __event->id); \
if (__ret < 0) \
return; \
/* Control code (field ordering) */ \