2 * Copyright (C) 2020 Philippe Proulx <pproulx@efficios.com>
4 * SPDX-License-Identifier: LGPL-2.1-only
8 #ifndef LTTNG_EVENT_FIELD_VALUE_INTERNAL_H
9 #define LTTNG_EVENT_FIELD_VALUE_INTERNAL_H
11 #include <common/dynamic-array.hpp>
13 #include <lttng/event-field-value.h>
17 struct lttng_event_field_value {
18 enum lttng_event_field_value_type type;
22 * `LTTNG_EVENT_FIELD_VALUE_TYPE_UNSIGNED_INT`.
24 struct lttng_event_field_value_uint {
25 struct lttng_event_field_value parent;
30 * `LTTNG_EVENT_FIELD_VALUE_TYPE_SIGNED_INT`.
32 struct lttng_event_field_value_int {
33 struct lttng_event_field_value parent;
38 * `LTTNG_EVENT_FIELD_VALUE_TYPE_UNSIGNED_ENUM` and
39 * `LTTNG_EVENT_FIELD_VALUE_TYPE_SIGNED_ENUM` (base).
41 struct lttng_event_field_value_enum {
42 struct lttng_event_field_value parent;
45 * Array of `char *` (owned by this).
47 struct lttng_dynamic_pointer_array labels;
51 * `LTTNG_EVENT_FIELD_VALUE_TYPE_UNSIGNED_ENUM`.
53 struct lttng_event_field_value_enum_uint {
54 struct lttng_event_field_value_enum parent;
59 * `LTTNG_EVENT_FIELD_VALUE_TYPE_SIGNED_ENUM`.
61 struct lttng_event_field_value_enum_int {
62 struct lttng_event_field_value_enum parent;
66 /* `LTTNG_EVENT_FIELD_VALUE_TYPE_REAL` */
67 struct lttng_event_field_value_real {
68 struct lttng_event_field_value parent;
72 /* `LTTNG_EVENT_FIELD_VALUE_TYPE_STRING` */
73 struct lttng_event_field_value_string {
74 struct lttng_event_field_value parent;
80 /* `LTTNG_EVENT_FIELD_VALUE_TYPE_STRING` */
81 struct lttng_event_field_value_array {
82 struct lttng_event_field_value parent;
85 * Array of `struct lttng_event_field_value *` (owned by this).
87 * A `NULL` element means it's unavailable
88 * (`LTTNG_EVENT_FIELD_VALUE_STATUS_UNAVAILABLE` status).
90 struct lttng_dynamic_pointer_array elems;
94 * This is internal since the session daemon knows nothing about the
95 * enumeration fields produced by the kernel tracer. Indeed, the kernel tracer
96 * manages its own metadata which remains opaque to the rest of the toolchain.
98 * Enumerations could be supported for the user space tracer, but it is not the
103 * Sets `*count` to the number of labels of the enumeration event field
108 * `LTTNG_EVENT_FIELD_VALUE_STATUS_OK`:
111 * `LTTNG_EVENT_FIELD_VALUE_STATUS_INVALID`:
112 * * `field_val` is `NULL`.
113 * * The type of `field_val` is not
114 * `LTTNG_EVENT_FIELD_VALUE_TYPE_UNSIGNED_ENUM` or
115 * `LTTNG_EVENT_FIELD_VALUE_TYPE_SIGNED_ENUM`.
116 * * `count` is `NULL`.
118 enum lttng_event_field_value_status
119 lttng_event_field_value_enum_get_label_count(const struct lttng_event_field_value *field_val,
120 unsigned int *count);
123 * Returns the label at index `index` of the enumeration event field
124 * value `field_val`, or `NULL` if:
126 * * `field_val` is `NULL`.
127 * * The type of `field_val` is not
128 * `LTTNG_EVENT_FIELD_VALUE_TYPE_UNSIGNED_ENUM` or
129 * `LTTNG_EVENT_FIELD_VALUE_TYPE_SIGNED_ENUM`.
130 * * `index` is greater than or equal to the label count of `field_val`,
131 * as returned by lttng_event_field_value_enum_get_label_count().
134 lttng_event_field_value_enum_get_label_at_index(const struct lttng_event_field_value *field_val,
137 struct lttng_event_field_value *lttng_event_field_value_uint_create(uint64_t val);
139 struct lttng_event_field_value *lttng_event_field_value_int_create(int64_t val);
141 struct lttng_event_field_value *lttng_event_field_value_enum_uint_create(uint64_t val);
143 struct lttng_event_field_value *lttng_event_field_value_enum_int_create(int64_t val);
145 struct lttng_event_field_value *lttng_event_field_value_real_create(double val);
147 struct lttng_event_field_value *lttng_event_field_value_string_create(const char *val);
149 struct lttng_event_field_value *lttng_event_field_value_string_create_with_size(const char *val,
152 struct lttng_event_field_value *lttng_event_field_value_array_create();
154 int lttng_event_field_value_enum_append_label(struct lttng_event_field_value *field_val,
157 int lttng_event_field_value_enum_append_label_with_size(struct lttng_event_field_value *field_val,
161 int lttng_event_field_value_array_append(struct lttng_event_field_value *array_field_val,
162 struct lttng_event_field_value *field_val);
164 int lttng_event_field_value_array_append_unavailable(
165 struct lttng_event_field_value *array_field_val);
167 void lttng_event_field_value_destroy(struct lttng_event_field_value *field_val);
169 #endif /* LTTNG_EVENT_FIELD_VALUE_INTERNAL_H */