Commit | Line | Data |
---|---|---|
d28fcdec PP |
1 | /* |
2 | * Copyright (C) 2020 Philippe Proulx <pproulx@efficios.com> | |
3 | * | |
4 | * SPDX-License-Identifier: LGPL-2.1-only | |
5 | * | |
6 | */ | |
7 | ||
8 | #ifndef LTTNG_EVENT_FIELD_VALUE_INTERNAL_H | |
9 | #define LTTNG_EVENT_FIELD_VALUE_INTERNAL_H | |
10 | ||
d28fcdec PP |
11 | #include <stdint.h> |
12 | #include <lttng/event-field-value.h> | |
c9e313bc | 13 | #include <common/dynamic-array.hpp> |
d28fcdec PP |
14 | |
15 | struct lttng_event_field_value { | |
16 | enum lttng_event_field_value_type type; | |
17 | }; | |
18 | ||
19 | /* | |
20 | * `LTTNG_EVENT_FIELD_VALUE_TYPE_UNSIGNED_INT`. | |
21 | */ | |
22 | struct lttng_event_field_value_uint { | |
23 | struct lttng_event_field_value parent; | |
24 | uint64_t val; | |
25 | }; | |
26 | ||
27 | /* | |
28 | * `LTTNG_EVENT_FIELD_VALUE_TYPE_SIGNED_INT`. | |
29 | */ | |
30 | struct lttng_event_field_value_int { | |
31 | struct lttng_event_field_value parent; | |
32 | int64_t val; | |
33 | }; | |
34 | ||
35 | /* | |
36 | * `LTTNG_EVENT_FIELD_VALUE_TYPE_UNSIGNED_ENUM` and | |
37 | * `LTTNG_EVENT_FIELD_VALUE_TYPE_SIGNED_ENUM` (base). | |
38 | */ | |
39 | struct lttng_event_field_value_enum { | |
40 | struct lttng_event_field_value parent; | |
41 | ||
42 | /* | |
43 | * Array of `char *` (owned by this). | |
44 | */ | |
45 | struct lttng_dynamic_pointer_array labels; | |
46 | }; | |
47 | ||
48 | /* | |
49 | * `LTTNG_EVENT_FIELD_VALUE_TYPE_UNSIGNED_ENUM`. | |
50 | */ | |
51 | struct lttng_event_field_value_enum_uint { | |
52 | struct lttng_event_field_value_enum parent; | |
53 | uint64_t val; | |
54 | }; | |
55 | ||
56 | /* | |
57 | * `LTTNG_EVENT_FIELD_VALUE_TYPE_SIGNED_ENUM`. | |
58 | */ | |
59 | struct lttng_event_field_value_enum_int { | |
60 | struct lttng_event_field_value_enum parent; | |
61 | int64_t val; | |
62 | }; | |
63 | ||
64 | /* `LTTNG_EVENT_FIELD_VALUE_TYPE_REAL` */ | |
65 | struct lttng_event_field_value_real { | |
66 | struct lttng_event_field_value parent; | |
67 | double val; | |
68 | }; | |
69 | ||
70 | /* `LTTNG_EVENT_FIELD_VALUE_TYPE_STRING` */ | |
71 | struct lttng_event_field_value_string { | |
72 | struct lttng_event_field_value parent; | |
73 | ||
74 | /* Owned by this */ | |
75 | char *val; | |
76 | }; | |
77 | ||
78 | /* `LTTNG_EVENT_FIELD_VALUE_TYPE_STRING` */ | |
79 | struct lttng_event_field_value_array { | |
80 | struct lttng_event_field_value parent; | |
81 | ||
82 | /* | |
83 | * Array of `struct lttng_event_field_value *` (owned by this). | |
84 | * | |
85 | * A `NULL` element means it's unavailable | |
86 | * (`LTTNG_EVENT_FIELD_VALUE_STATUS_UNAVAILABLE` status). | |
87 | */ | |
88 | struct lttng_dynamic_pointer_array elems; | |
89 | }; | |
90 | ||
91 | /* | |
92 | * This is internal since the session daemon knows nothing about the | |
93 | * enumeration fields produced by the kernel tracer. Indeed, the kernel tracer | |
94 | * manages its own metadata which remains opaque to the rest of the toolchain. | |
95 | * | |
96 | * Enumerations could be supported for the user space tracer, but it is not the | |
97 | * case right now. | |
98 | */ | |
99 | ||
100 | /* | |
101 | * Sets `*count` to the number of labels of the enumeration event field | |
102 | * value `field_val`. | |
103 | * | |
104 | * Returns: | |
105 | * | |
106 | * `LTTNG_EVENT_FIELD_VALUE_STATUS_OK`: | |
107 | * Success. | |
108 | * | |
109 | * `LTTNG_EVENT_FIELD_VALUE_STATUS_INVALID`: | |
110 | * * `field_val` is `NULL`. | |
111 | * * The type of `field_val` is not | |
112 | * `LTTNG_EVENT_FIELD_VALUE_TYPE_UNSIGNED_ENUM` or | |
113 | * `LTTNG_EVENT_FIELD_VALUE_TYPE_SIGNED_ENUM`. | |
114 | * * `count` is `NULL`. | |
115 | */ | |
d28fcdec PP |
116 | enum lttng_event_field_value_status |
117 | lttng_event_field_value_enum_get_label_count( | |
118 | const struct lttng_event_field_value *field_val, | |
119 | unsigned int *count); | |
120 | ||
121 | /* | |
122 | * Returns the label at index `index` of the enumeration event field | |
123 | * value `field_val`, or `NULL` if: | |
124 | * | |
125 | * * `field_val` is `NULL`. | |
126 | * * The type of `field_val` is not | |
127 | * `LTTNG_EVENT_FIELD_VALUE_TYPE_UNSIGNED_ENUM` or | |
128 | * `LTTNG_EVENT_FIELD_VALUE_TYPE_SIGNED_ENUM`. | |
129 | * * `index` is greater than or equal to the label count of `field_val`, | |
130 | * as returned by lttng_event_field_value_enum_get_label_count(). | |
131 | */ | |
d28fcdec PP |
132 | const char *lttng_event_field_value_enum_get_label_at_index( |
133 | const struct lttng_event_field_value *field_val, | |
134 | unsigned int index); | |
135 | ||
d28fcdec PP |
136 | struct lttng_event_field_value *lttng_event_field_value_uint_create( |
137 | uint64_t val); | |
138 | ||
d28fcdec PP |
139 | struct lttng_event_field_value *lttng_event_field_value_int_create( |
140 | int64_t val); | |
141 | ||
d28fcdec PP |
142 | struct lttng_event_field_value *lttng_event_field_value_enum_uint_create( |
143 | uint64_t val); | |
144 | ||
d28fcdec PP |
145 | struct lttng_event_field_value *lttng_event_field_value_enum_int_create( |
146 | int64_t val); | |
147 | ||
d28fcdec PP |
148 | struct lttng_event_field_value *lttng_event_field_value_real_create(double val); |
149 | ||
d28fcdec PP |
150 | struct lttng_event_field_value *lttng_event_field_value_string_create( |
151 | const char *val); | |
152 | ||
d28fcdec PP |
153 | struct lttng_event_field_value *lttng_event_field_value_string_create_with_size( |
154 | const char *val, size_t size); | |
155 | ||
d28fcdec PP |
156 | struct lttng_event_field_value *lttng_event_field_value_array_create(void); |
157 | ||
d28fcdec PP |
158 | int lttng_event_field_value_enum_append_label( |
159 | struct lttng_event_field_value *field_val, const char *label); | |
160 | ||
d28fcdec PP |
161 | int lttng_event_field_value_enum_append_label_with_size( |
162 | struct lttng_event_field_value *field_val, const char *label, | |
163 | size_t size); | |
164 | ||
d28fcdec PP |
165 | int lttng_event_field_value_array_append( |
166 | struct lttng_event_field_value *array_field_val, | |
167 | struct lttng_event_field_value *field_val); | |
168 | ||
d28fcdec PP |
169 | int lttng_event_field_value_array_append_unavailable( |
170 | struct lttng_event_field_value *array_field_val); | |
171 | ||
d28fcdec PP |
172 | void lttng_event_field_value_destroy(struct lttng_event_field_value *field_val); |
173 | ||
174 | #endif /* LTTNG_EVENT_FIELD_VALUE_INTERNAL_H */ |