ctf plugin: notif iter: use "borrow" functions for metadata where possible
[babeltrace.git] / lib / ctf-ir / event-class.c
CommitLineData
272df73e
PP
1/*
2 * event-class.c
3 *
4 * Babeltrace CTF IR - Event class
5 *
6 * Copyright 2013, 2014 Jérémie Galarneau <jeremie.galarneau@efficios.com>
7 *
8 * Author: Jérémie Galarneau <jeremie.galarneau@efficios.com>
9 *
10 * Permission is hereby granted, free of charge, to any person obtaining a copy
11 * of this software and associated documentation files (the "Software"), to deal
12 * in the Software without restriction, including without limitation the rights
13 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14 * copies of the Software, and to permit persons to whom the Software is
15 * furnished to do so, subject to the following conditions:
16 *
17 * The above copyright notice and this permission notice shall be included in
18 * all copies or substantial portions of the Software.
19 *
20 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26 * SOFTWARE.
27 */
28
f8b979f9
PP
29#define BT_LOG_TAG "EVENT-CLASS"
30#include <babeltrace/lib-logging-internal.h>
31
3dca2276 32#include <babeltrace/assert-pre-internal.h>
272df73e
PP
33#include <babeltrace/ctf-ir/fields-internal.h>
34#include <babeltrace/ctf-ir/field-types-internal.h>
35#include <babeltrace/ctf-ir/event-class.h>
36#include <babeltrace/ctf-ir/event-class-internal.h>
37#include <babeltrace/ctf-ir/stream-class.h>
38#include <babeltrace/ctf-ir/stream-class-internal.h>
39#include <babeltrace/ctf-ir/trace-internal.h>
40#include <babeltrace/ctf-ir/validation-internal.h>
41#include <babeltrace/ctf-ir/utils.h>
2a3ced3c 42#include <babeltrace/ctf-ir/utils-internal.h>
272df73e
PP
43#include <babeltrace/ref.h>
44#include <babeltrace/ctf-ir/attributes-internal.h>
3d9990ac
PP
45#include <babeltrace/compiler-internal.h>
46#include <babeltrace/endian-internal.h>
c55a9f58 47#include <babeltrace/types.h>
f8b979f9 48#include <babeltrace/values-internal.h>
f6ccaed9 49#include <babeltrace/assert-internal.h>
dc3fffef 50#include <inttypes.h>
0fbb9a9f 51#include <stdlib.h>
272df73e 52
3dca2276
PP
53BT_HIDDEN
54void bt_event_class_common_finalize(struct bt_object *obj)
272df73e 55{
3dca2276 56 struct bt_event_class_common *event_class;
272df73e 57
3dca2276
PP
58 event_class = container_of(obj, struct bt_event_class_common, base);
59 BT_LOGD("Finalizing common event class: addr=%p, name=\"%s\", id=%" PRId64,
60 event_class, bt_event_class_common_get_name(event_class),
61 bt_event_class_common_get_id(event_class));
f8b979f9 62
3dca2276
PP
63 if (event_class->name) {
64 g_string_free(event_class->name, TRUE);
cf76ce92
PP
65 }
66
3dca2276
PP
67 if (event_class->emf_uri) {
68 g_string_free(event_class->emf_uri, TRUE);
272df73e
PP
69 }
70
3dca2276
PP
71 BT_LOGD_STR("Putting context field type.");
72 bt_put(event_class->context_field_type);
73 BT_LOGD_STR("Putting payload field type.");
74 bt_put(event_class->payload_field_type);
75}
76
77BT_HIDDEN
78int bt_event_class_common_initialize(struct bt_event_class_common *event_class,
79 const char *name, bt_object_release_func release_func,
80 bt_field_type_structure_create_func ft_struct_create_func)
81{
82 int ret = 0;
83
84 BT_LOGD("Initializing common event class object: name=\"%s\"",
85 name);
86 bt_object_init(event_class, release_func);
87 event_class->payload_field_type = ft_struct_create_func();
88 if (!event_class->payload_field_type) {
f8b979f9 89 BT_LOGE_STR("Cannot create event class's initial payload field type object.");
272df73e
PP
90 goto error;
91 }
92
cf76ce92
PP
93 event_class->id = -1;
94 event_class->name = g_string_new(name);
95 if (!event_class->name) {
96 BT_LOGE_STR("Failed to allocate a GString.");
272df73e
PP
97 goto error;
98 }
99
cf76ce92
PP
100 event_class->emf_uri = g_string_new(NULL);
101 if (!event_class->emf_uri) {
102 BT_LOGE_STR("Failed to allocate a GString.");
272df73e
PP
103 goto error;
104 }
105
50842bdc 106 event_class->log_level = BT_EVENT_CLASS_LOG_LEVEL_UNSPECIFIED;
3dca2276
PP
107 BT_LOGD("Initialized common event class object: addr=%p, name=\"%s\"",
108 event_class, bt_event_class_common_get_name(event_class));
109 return ret;
272df73e
PP
110
111error:
3dca2276 112 ret = -1;
272df73e
PP
113 return ret;
114}
115
3dca2276
PP
116static
117void bt_event_class_destroy(struct bt_object *obj)
272df73e 118{
3dca2276
PP
119 BT_LOGD("Destroying event class: addr=%p", obj);
120 bt_event_class_common_finalize(obj);
121 g_free(obj);
272df73e
PP
122}
123
3dca2276 124struct bt_event_class *bt_event_class_create(const char *name)
272df73e 125{
3dca2276
PP
126 int ret;
127 struct bt_event_class *event_class = NULL;
272df73e 128
3dca2276
PP
129 if (!name) {
130 BT_LOGW_STR("Invalid parameter: name is NULL.");
131 goto error;
cf76ce92 132 }
272df73e 133
3dca2276
PP
134 BT_LOGD("Creating event class object: name=\"%s\"",
135 name);
136 event_class = g_new0(struct bt_event_class, 1);
272df73e 137 if (!event_class) {
3dca2276
PP
138 BT_LOGE_STR("Failed to allocate one event class.");
139 goto error;
272df73e
PP
140 }
141
3dca2276
PP
142 ret = bt_event_class_common_initialize(BT_TO_COMMON(event_class),
143 name, bt_event_class_destroy,
144 (bt_field_type_structure_create_func)
145 bt_field_type_structure_create);
146 if (ret) {
147 goto error;
272df73e
PP
148 }
149
3dca2276
PP
150 BT_LOGD("Created event class object: addr=%p, name=\"%s\"",
151 event_class, bt_event_class_get_name(event_class));
152 goto end;
272df73e 153
3dca2276
PP
154error:
155 bt_put(event_class);
272df73e
PP
156
157end:
3dca2276 158 return event_class;
272df73e
PP
159}
160
3dca2276 161const char *bt_event_class_get_name(struct bt_event_class *event_class)
272df73e 162{
3dca2276 163 return bt_event_class_common_get_name(BT_TO_COMMON(event_class));
272df73e
PP
164}
165
3dca2276 166int64_t bt_event_class_get_id(struct bt_event_class *event_class)
272df73e 167{
3dca2276 168 return bt_event_class_common_get_id(BT_TO_COMMON(event_class));
272df73e
PP
169}
170
3dca2276 171int bt_event_class_set_id(struct bt_event_class *event_class, uint64_t id)
272df73e 172{
3dca2276 173 return bt_event_class_common_set_id(BT_TO_COMMON(event_class), id);
272df73e
PP
174}
175
3dca2276
PP
176enum bt_event_class_log_level bt_event_class_get_log_level(
177 struct bt_event_class *event_class)
272df73e 178{
3dca2276 179 return bt_event_class_common_get_log_level(BT_TO_COMMON(event_class));
272df73e
PP
180}
181
3dca2276
PP
182int bt_event_class_set_log_level(struct bt_event_class *event_class,
183 enum bt_event_class_log_level log_level)
272df73e 184{
3dca2276
PP
185 return bt_event_class_common_set_log_level(BT_TO_COMMON(event_class),
186 log_level);
272df73e
PP
187}
188
3dca2276 189const char *bt_event_class_get_emf_uri(struct bt_event_class *event_class)
272df73e 190{
3dca2276 191 return bt_event_class_common_get_emf_uri(BT_TO_COMMON(event_class));
272df73e
PP
192}
193
3dca2276
PP
194int bt_event_class_set_emf_uri(struct bt_event_class *event_class,
195 const char *emf_uri)
272df73e 196{
3dca2276
PP
197 return bt_event_class_common_set_emf_uri(BT_TO_COMMON(event_class),
198 emf_uri);
272df73e
PP
199}
200
094ff7c0 201struct bt_stream_class *bt_event_class_borrow_stream_class(
50842bdc 202 struct bt_event_class *event_class)
272df73e 203{
d975f66c 204 BT_ASSERT_PRE_NON_NULL(event_class, "Event class");
094ff7c0
PP
205 return BT_FROM_COMMON(
206 bt_event_class_common_borrow_stream_class(BT_TO_COMMON(
207 event_class)));
272df73e
PP
208}
209
094ff7c0 210struct bt_field_type *bt_event_class_borrow_payload_field_type(
3dca2276 211 struct bt_event_class *event_class)
272df73e 212{
094ff7c0 213 return BT_FROM_COMMON(bt_event_class_common_borrow_payload_field_type(
3dca2276 214 BT_TO_COMMON(event_class)));
272df73e
PP
215}
216
3dca2276
PP
217int bt_event_class_set_payload_field_type(struct bt_event_class *event_class,
218 struct bt_field_type *field_type)
272df73e 219{
3dca2276
PP
220 return bt_event_class_common_set_payload_field_type(
221 BT_TO_COMMON(event_class), (void *) field_type);
272df73e
PP
222}
223
094ff7c0 224struct bt_field_type *bt_event_class_borrow_context_field_type(
3dca2276 225 struct bt_event_class *event_class)
272df73e 226{
094ff7c0 227 return BT_FROM_COMMON(bt_event_class_common_borrow_context_field_type(
3dca2276 228 BT_TO_COMMON(event_class)));
272df73e
PP
229}
230
3dca2276
PP
231int bt_event_class_set_context_field_type(
232 struct bt_event_class *event_class,
233 struct bt_field_type *field_type)
272df73e 234{
3dca2276
PP
235 return bt_event_class_common_set_context_field_type(
236 BT_TO_COMMON(event_class), (void *) field_type);
272df73e
PP
237}
238
239BT_HIDDEN
3dca2276 240void bt_event_class_common_freeze(struct bt_event_class_common *event_class)
272df73e 241{
f6ccaed9 242 BT_ASSERT(event_class);
f8b979f9
PP
243
244 if (event_class->frozen) {
245 return;
246 }
247
248 BT_LOGD("Freezing event class: addr=%p, name=\"%s\", id=%" PRId64,
3dca2276
PP
249 event_class, bt_event_class_common_get_name(event_class),
250 bt_event_class_common_get_id(event_class));
272df73e 251 event_class->frozen = 1;
0352f8fa 252 BT_LOGD_STR("Freezing event class's context field type.");
3dca2276 253 bt_field_type_common_freeze(event_class->context_field_type);
0352f8fa 254 BT_LOGD_STR("Freezing event class's payload field type.");
3dca2276 255 bt_field_type_common_freeze(event_class->payload_field_type);
272df73e 256}
2a3ced3c
PP
257
258BT_HIDDEN
3dca2276
PP
259int bt_event_class_common_validate_single_clock_class(
260 struct bt_event_class_common *event_class,
2a3ced3c
PP
261 struct bt_clock_class **expected_clock_class)
262{
263 int ret = 0;
264
f6ccaed9
PP
265 BT_ASSERT(event_class);
266 BT_ASSERT(expected_clock_class);
3dca2276
PP
267 ret = bt_field_type_common_validate_single_clock_class(
268 event_class->context_field_type,
2a3ced3c
PP
269 expected_clock_class);
270 if (ret) {
271 BT_LOGW("Event class's context field type "
272 "is not recursively mapped to the "
273 "expected clock class: "
274 "event-class-addr=%p, "
275 "event-class-name=\"%s\", "
276 "event-class-id=%" PRId64 ", "
277 "ft-addr=%p",
278 event_class,
3dca2276 279 bt_event_class_common_get_name(event_class),
2a3ced3c 280 event_class->id,
3dca2276 281 event_class->context_field_type);
2a3ced3c
PP
282 goto end;
283 }
284
3dca2276
PP
285 ret = bt_field_type_common_validate_single_clock_class(
286 event_class->payload_field_type,
2a3ced3c
PP
287 expected_clock_class);
288 if (ret) {
289 BT_LOGW("Event class's payload field type "
290 "is not recursively mapped to the "
291 "expected clock class: "
292 "event-class-addr=%p, "
293 "event-class-name=\"%s\", "
294 "event-class-id=%" PRId64 ", "
295 "ft-addr=%p",
296 event_class,
3dca2276 297 bt_event_class_common_get_name(event_class),
2a3ced3c 298 event_class->id,
3dca2276 299 event_class->payload_field_type);
2a3ced3c
PP
300 goto end;
301 }
302
303end:
304 return ret;
305}
This page took 0.054054 seconds and 4 git commands to generate.