X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;ds=sidebyside;f=probes%2Flttng-events.h;h=f8dcf85c58a7d40787f0bf30e36c19417c60217e;hb=3afe7aaccff5c7d2889267ab64eac46ce72ac799;hp=b36e44f997cbb7c6576691ff317677d68fa1f3e5;hpb=85a8074292c4b3779437df0d7c737f3dba00ce58;p=lttng-modules.git diff --git a/probes/lttng-events.h b/probes/lttng-events.h index b36e44f9..f8dcf85c 100644 --- a/probes/lttng-events.h +++ b/probes/lttng-events.h @@ -151,10 +151,6 @@ static const struct lttng_event_desc TP_ID(__event_desc___, TRACE_SYSTEM)[] = { #define TP_ID1(_token, _system) _token##_system #define TP_ID(_token, _system) TP_ID1(_token, _system) -#define module_init_eval1(_token, _system) module_init(_token##_system) -#define module_init_eval(_token, _system) module_init_eval1(_token, _system) -#define module_exit_eval1(_token, _system) module_exit(_token##_system) -#define module_exit_eval(_token, _system) module_exit_eval1(_token, _system) static void *TP_ID(__lttng_seq_start__, TRACE_SYSTEM)(struct seq_file *m, loff_t *pos) @@ -252,17 +248,11 @@ error: return ret; } -module_init_eval(__lttng_types_init__, TRACE_SYSTEM); - static void TP_ID(__lttng_types_exit__, TRACE_SYSTEM)(void) { debugfs_remove(TP_ID(__lttng_types_dentry__, TRACE_SYSTEM)); } -module_exit_eval(__lttng_types_exit__, TRACE_SYSTEM); - -#undef module_init_eval -#undef module_exit_eval #undef TP_ID1 #undef TP_ID @@ -370,10 +360,47 @@ static inline size_t __event_get_align__##_name(_proto) \ #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) - /* * Stage 6 of the trace events. * + * Create structure declaration that allows the "assign" macros to access the + * field types. + */ + +#include "lttng-events-reset.h" /* Reset all macros within TRACE_EVENT */ + +/* Named field types must be defined in lttng-types.h */ + +#undef __field +#define __field(_type, _item) _type _item; + +#undef __field_ext +#define __field_ext(_type, _item, _filter_type) __field(_type, _item) + +#undef __array +#define __array(_type, _item, _length) _type _item; + +#undef __dynamic_array +#define __dynamic_array(_type, _item, _length) _type _item; + +#undef __string +#define __string(_item, _src) char _item; + +#undef TP_STRUCT__entry +#define TP_STRUCT__entry(args...) args + +#undef DECLARE_EVENT_CLASS +#define DECLARE_EVENT_CLASS(_name, _proto, _args, _tstruct, _assign, _print) \ +struct __event_typemap__##_name { \ + _tstruct \ +}; + +#include TRACE_INCLUDE(TRACE_INCLUDE_FILE) + + +/* + * Stage 7 of the trace events. + * * Create the probe function : call even size calculation and write event data * into the buffer. * @@ -386,7 +413,6 @@ static inline size_t __event_get_align__##_name(_proto) \ #undef __field #define __field(_type, _item) \ - lib_ring_buffer_align_ctx(&ctx, __alignof__(_type)); \ goto __assign_##_item; \ __end_field_##_item: @@ -395,16 +421,13 @@ __end_field_##_item: #undef __array #define __array(_type, _item, _length) \ - lib_ring_buffer_align_ctx(&ctx, __alignof__(_type)); \ goto __assign_##_item; \ __end_field_##_item: #undef __dynamic_array #define __dynamic_array(_type, _item, _length) \ - lib_ring_buffer_align_ctx(&ctx, __alignof__(u32)); \ goto __assign_##_item##_1; \ __end_field_##_item##_1: \ - lib_ring_buffer_align_ctx(&ctx, __alignof__(_type)); \ goto __assign_##_item##_2; \ __end_field_##_item##_2: @@ -421,14 +444,16 @@ __end_field_##_item: #define tp_assign(dest, src) \ __assign_##dest: \ { \ - __typeof__(src) __tmp = (src); \ - __chan->ops->event_write(&ctx, &__tmp, sizeof(src)); \ + __typeof__(__typemap.dest) __tmp = (src); \ + lib_ring_buffer_align_ctx(&ctx, __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)); \ __chan->ops->event_write(&ctx, src, len); \ goto __end_field_##dest; @@ -436,17 +461,19 @@ __assign_##dest: \ #define tp_memcpy_dyn(dest, src, len) \ __assign_##dest##_1: \ { \ - __typeof__(len) __tmpl = (len); \ + u32 __tmpl = (len); \ + lib_ring_buffer_align_ctx(&ctx, __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); \ goto __end_field_##dest##_2; #undef tp_strcpy #define tp_strcpy(dest, src) \ - tp_memcpy(dest, src, __get_dynamic_array_len(dest)); \ + tp_memcpy(dest, src, __get_dynamic_array_len(dest)) /* Named field types must be defined in lttng-types.h */ @@ -482,6 +509,7 @@ static void __event_probe__##_name(void *__data, _proto) \ size_t __event_len, __event_align; \ size_t __dynamic_len_idx = 0; \ size_t __dynamic_len[ARRAY_SIZE(__event_fields___##_name)]; \ + struct __event_typemap__##_name __typemap; \ int __ret; \ \ if (0) \ @@ -504,6 +532,56 @@ static void __event_probe__##_name(void *__data, _proto) \ #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) +/* + * Stage 8 of the trace events. + * + * Register/unregister probes at module load/unload. + */ + +#include "lttng-events-reset.h" /* Reset all macros within TRACE_EVENT */ + +#define TP_ID1(_token, _system) _token##_system +#define TP_ID(_token, _system) TP_ID1(_token, _system) +#define module_init_eval1(_token, _system) module_init(_token##_system) +#define module_init_eval(_token, _system) module_init_eval1(_token, _system) +#define module_exit_eval1(_token, _system) module_exit(_token##_system) +#define module_exit_eval(_token, _system) module_exit_eval1(_token, _system) + +#undef DEFINE_EVENT +#define DEFINE_EVENT(_template, _name, _proto, _args) \ + ret = ltt_probe_register(#_name, (void *) __event_probe__##_template); \ + WARN_ON_ONCE(ret); + +static int TP_ID(__lttng_events_init__, TRACE_SYSTEM)(void) +{ + int ret = 0; + + ret = TP_ID(__lttng_types_init__, TRACE_SYSTEM)(); + if (ret) + return ret; +#include TRACE_INCLUDE(TRACE_INCLUDE_FILE) + return ret; +} + +module_init_eval(__lttng_events_init__, TRACE_SYSTEM); + +#undef DEFINE_EVENT +#define DEFINE_EVENT(_template, _name, _proto, _args) \ + ltt_probe_unregister(#_name); + +static void TP_ID(__lttng_events_exit__, TRACE_SYSTEM)(void) +{ +#include TRACE_INCLUDE(TRACE_INCLUDE_FILE) + TP_ID(__lttng_types_exit__, TRACE_SYSTEM)(); +} + +module_exit_eval(__lttng_events_exit__, TRACE_SYSTEM); + +#undef module_init_eval +#undef module_exit_eval +#undef TP_ID1 +#undef TP_ID + #if 0 #include