From 20f1eee76014511d3bccda9d9ffd7856f8ecae16 Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Tue, 2 Aug 2011 21:36:22 -0400 Subject: [PATCH] TRACEPOINT_EVENT: add floating point support Signed-off-by: Mathieu Desnoyers --- include/ust/lttng-events.h | 31 ++++++++++++++++++++++ include/ust/lttng-tracepoint-event-reset.h | 3 +++ include/ust/lttng-tracepoint-event.h | 24 +++++++++++++++++ 3 files changed, 58 insertions(+) diff --git a/include/ust/lttng-events.h b/include/ust/lttng-events.h index 743ff16..ff66bc4 100644 --- a/include/ust/lttng-events.h +++ b/include/ust/lttng-events.h @@ -15,6 +15,8 @@ #include #include #include +#include +#include #undef is_signed_type #define is_signed_type(type) (((type)(-1)) < 0) @@ -32,6 +34,7 @@ enum abstract_types { atype_array, atype_sequence, atype_string, + atype_float, NR_ABSTRACT_TYPES, }; @@ -71,6 +74,33 @@ struct lttng_integer_type { enum lttng_string_encodings encoding; }; +#define _float_mant_dig(_type) \ + (sizeof(_type) == sizeof(float) ? FLT_MANT_DIG \ + : (sizeof(_type) == sizeof(double) ? DBL_MANT_DIG \ + : (sizeof(_type) == sizeof(long double) ? LDBL_MANT_DIG \ + : 0))) + +#define __type_float(_type) \ + { \ + .atype = atype_float, \ + .u.basic._float = \ + { \ + .exp_dig = sizeof(_type) * CHAR_BIT \ + - _float_mant_dig(_type), \ + .mant_dig = _float_mant_dig(_type), \ + .alignment = ltt_alignof(_type) * CHAR_BIT, \ + .signedness = is_signed_type(_type), \ + .reverse_byte_order = __BYTE_ORDER != __FLOAT_WORD_ORDER, \ + }, \ + } \ + +struct lttng_float_type { + unsigned int exp_dig; /* exponent digits, in bits */ + unsigned int mant_dig; /* mantissa digits, in bits */ + unsigned short alignment; /* in bits */ + unsigned int reverse_byte_order:1; +}; + union _lttng_basic_type { struct lttng_integer_type integer; struct { @@ -79,6 +109,7 @@ union _lttng_basic_type { struct { enum lttng_string_encodings encoding; } string; + struct lttng_float_type _float; }; struct lttng_basic_type { diff --git a/include/ust/lttng-tracepoint-event-reset.h b/include/ust/lttng-tracepoint-event-reset.h index b42a794..7cc8277 100644 --- a/include/ust/lttng-tracepoint-event-reset.h +++ b/include/ust/lttng-tracepoint-event-reset.h @@ -11,6 +11,9 @@ #undef ctf_integer_ext #define ctf_integer_ext(_type, _item, _src, _byte_order, _base) +#undef ctf_float +#define ctf_float(_type, _item, _src) + #undef ctf_array_encoded #define ctf_array_encoded(_type, _item, _src, _length, _encoding) diff --git a/include/ust/lttng-tracepoint-event.h b/include/ust/lttng-tracepoint-event.h index 10b2d23..c6e71e8 100644 --- a/include/ust/lttng-tracepoint-event.h +++ b/include/ust/lttng-tracepoint-event.h @@ -98,6 +98,13 @@ .type = __type_integer(_type, _byte_order, _base, none),\ }, +#undef ctf_float +#define ctf_float(_type, _item, _src) \ + { \ + .name = #_item, \ + .type = __type_float(_type), \ + }, + #undef ctf_array_encoded #define ctf_array_encoded(_type, _item, _src, _length, _encoding) \ { \ @@ -234,6 +241,11 @@ static struct lttng_probe_desc TP_ID(__probe_desc___, TRACE_SYSTEM) = { __event_len += lib_ring_buffer_align(__event_len, ltt_alignof(_type)); \ __event_len += sizeof(_type); +#undef ctf_float +#define ctf_float(_type, _item, _src) \ + __event_len += lib_ring_buffer_align(__event_len, ltt_alignof(_type)); \ + __event_len += sizeof(_type); + #undef ctf_array_encoded #define ctf_array_encoded(_type, _item, _src, _length) \ __event_len += lib_ring_buffer_align(__event_len, ltt_alignof(_type)); \ @@ -289,6 +301,10 @@ static inline size_t __event_get_size__##_name(size_t *__dynamic_len, _proto) \ #define ctf_integer_ext(_type, _item, _src, _byte_order, _base) \ __event_align = max_t(size_t, __event_align, ltt_alignof(_type)); +#undef ctf_float +#define ctf_float(_type, _item, _src) \ + __event_align = max_t(size_t, __event_align, ltt_alignof(_type)); + #undef ctf_array_encoded #define ctf_array_encoded(_type, _item, _src, _length) \ __event_align = max_t(size_t, __event_align, ltt_alignof(_type)); @@ -342,6 +358,14 @@ static inline size_t __event_get_align__##_name(_proto) \ __chan->ops->event_write(&ctx, &__tmp, sizeof(__tmp)); \ } +#undef ctf_float +#define ctf_float(_type, _item, _src) \ + { \ + _type __tmp = (_src); \ + lib_ring_buffer_align_ctx(&ctx, ltt_alignof(__tmp)); \ + __chan->ops->event_write(&ctx, &__tmp, sizeof(__tmp)); \ + } + #undef ctf_array_encoded #define ctf_array_encoded(_type, _item, _src, _length) \ lib_ring_buffer_align_ctx(&ctx, ltt_alignof(_type)); \ -- 2.34.1