ctf plugin: notif iter: use "borrow" functions for metadata where possible
[babeltrace.git] / lib / ctf-ir / event.c
CommitLineData
273b65be
JG
1/*
2 * event.c
3 *
d2dc44b6 4 * Babeltrace CTF IR - Event
273b65be 5 *
de9dd397 6 * Copyright 2013, 2014 Jérémie Galarneau <jeremie.galarneau@efficios.com>
273b65be
JG
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
7b010242
PP
29#define BT_LOG_TAG "EVENT"
30#include <babeltrace/lib-logging-internal.h>
31
3dca2276 32#include <babeltrace/assert-pre-internal.h>
2e33ac5a
PP
33#include <babeltrace/ctf-ir/fields-internal.h>
34#include <babeltrace/ctf-ir/field-types-internal.h>
ac0c6bdd 35#include <babeltrace/ctf-ir/clock-class.h>
c057dea0
PP
36#include <babeltrace/ctf-ir/clock-value.h>
37#include <babeltrace/ctf-ir/clock-value-internal.h>
7b010242 38#include <babeltrace/ctf-ir/clock-class-internal.h>
adc315b8 39#include <babeltrace/ctf-ir/event-internal.h>
272df73e
PP
40#include <babeltrace/ctf-ir/event-class.h>
41#include <babeltrace/ctf-ir/event-class-internal.h>
2f100782 42#include <babeltrace/ctf-ir/stream-class.h>
c35a1669 43#include <babeltrace/ctf-ir/stream-class-internal.h>
41ac640a 44#include <babeltrace/ctf-ir/stream-internal.h>
4ce9f9d0
PP
45#include <babeltrace/ctf-ir/packet.h>
46#include <babeltrace/ctf-ir/packet-internal.h>
3dca2276 47#include <babeltrace/ctf-ir/trace.h>
bc37ae52 48#include <babeltrace/ctf-ir/trace-internal.h>
09840de5 49#include <babeltrace/ctf-ir/validation-internal.h>
5c3b707d 50#include <babeltrace/ctf-ir/packet-internal.h>
654c1444 51#include <babeltrace/ctf-ir/utils.h>
83509119 52#include <babeltrace/ref.h>
44e0a4f5 53#include <babeltrace/ctf-ir/attributes-internal.h>
3d9990ac 54#include <babeltrace/compiler-internal.h>
f6ccaed9 55#include <babeltrace/assert-internal.h>
7b010242 56#include <inttypes.h>
273b65be 57
273b65be 58static
50842bdc 59void bt_event_destroy(struct bt_object *obj);
273b65be 60
3dca2276
PP
61static
62int bt_event_common_validate_types_for_create(
63 struct bt_event_class_common *event_class,
64 struct bt_validation_output *validation_output,
65 bt_validation_flag_copy_field_type_func copy_field_type_func)
273b65be 66{
09840de5 67 int ret;
50842bdc
PP
68 enum bt_validation_flag validation_flags =
69 BT_VALIDATION_FLAG_STREAM |
70 BT_VALIDATION_FLAG_EVENT;
3dca2276
PP
71 struct bt_trace_common *trace = NULL;
72 struct bt_stream_class_common *stream_class = NULL;
73 struct bt_field_type_common *packet_header_type = NULL;
74 struct bt_field_type_common *packet_context_type = NULL;
75 struct bt_field_type_common *event_header_type = NULL;
76 struct bt_field_type_common *stream_event_ctx_type = NULL;
77 struct bt_field_type_common *event_context_type = NULL;
78 struct bt_field_type_common *event_payload_type = NULL;
09840de5 79 int trace_valid = 0;
3dca2276 80 struct bt_value *environment = NULL;
2a3ced3c 81
3dca2276
PP
82 stream_class = bt_event_class_common_borrow_stream_class(event_class);
83 BT_ASSERT(stream_class);
84 trace = bt_stream_class_common_borrow_trace(stream_class);
09840de5 85 if (trace) {
3dca2276 86 BT_LOGD_STR("Event class is part of a trace.");
094ff7c0
PP
87 packet_header_type =
88 bt_trace_common_borrow_packet_header_field_type(trace);
09840de5 89 trace_valid = trace->valid;
f6ccaed9 90 BT_ASSERT(trace_valid);
09840de5
PP
91 environment = trace->environment;
92 }
93
094ff7c0
PP
94 packet_context_type =
95 bt_stream_class_common_borrow_packet_context_field_type(
96 stream_class);
97 event_header_type =
98 bt_stream_class_common_borrow_event_header_field_type(
99 stream_class);
100 stream_event_ctx_type =
101 bt_stream_class_common_borrow_event_context_field_type(
102 stream_class);
103 event_context_type =
104 bt_event_class_common_borrow_context_field_type(event_class);
105 event_payload_type =
106 bt_event_class_common_borrow_payload_field_type(event_class);
50842bdc 107 ret = bt_validate_class_types(environment, packet_header_type,
09840de5
PP
108 packet_context_type, event_header_type, stream_event_ctx_type,
109 event_context_type, event_payload_type, trace_valid,
110 stream_class->valid, event_class->valid,
3dca2276 111 validation_output, validation_flags, copy_field_type_func);
09840de5
PP
112 if (ret) {
113 /*
114 * This means something went wrong during the validation
115 * process, not that the objects are invalid.
116 */
e0bcd1b0 117 BT_LOGE("Failed to validate event and parents: ret=%d", ret);
09840de5
PP
118 goto error;
119 }
120
3dca2276 121 if ((validation_output->valid_flags & validation_flags) !=
09840de5
PP
122 validation_flags) {
123 /* Invalid trace/stream class/event class */
3ee09f3a 124 BT_LOGW("Invalid trace, stream class, or event class: "
3dca2276 125 "valid-flags=0x%x", validation_output->valid_flags);
09840de5
PP
126 goto error;
127 }
128
3dca2276 129 goto end;
0c1fafed 130
3dca2276
PP
131error:
132 bt_validation_output_put_types(validation_output);
133 ret = -1;
b8248cc0 134
3dca2276 135end:
3dca2276
PP
136 return ret;
137}
09840de5 138
3dca2276
PP
139static
140int bt_event_common_create_fields(
141 struct bt_validation_output *validation_output,
142 void *(*create_field_func)(void *),
143 struct bt_field_common **header_field,
144 struct bt_field_common **stream_event_context_field,
145 struct bt_field_common **context_field,
146 struct bt_field_common **payload_field)
147{
148 int ret = 0;
be514b0c 149
3dca2276 150 if (validation_output->event_header_type) {
be514b0c 151 BT_LOGD("Creating initial event header field: ft-addr=%p",
3dca2276
PP
152 validation_output->event_header_type);
153 *header_field =
154 create_field_func(validation_output->event_header_type);
155 if (!*header_field) {
be514b0c
PP
156 BT_LOGE_STR("Cannot create initial event header field object.");
157 goto error;
158 }
662e778c 159 }
09840de5 160
3dca2276 161 if (validation_output->stream_event_ctx_type) {
be514b0c 162 BT_LOGD("Creating initial stream event context field: ft-addr=%p",
3dca2276
PP
163 validation_output->stream_event_ctx_type);
164 *stream_event_context_field = create_field_func(
165 validation_output->stream_event_ctx_type);
166 if (!*stream_event_context_field) {
7b010242 167 BT_LOGE_STR("Cannot create initial stream event context field object.");
5fd2e9fd
PP
168 goto error;
169 }
170 }
171
3dca2276 172 if (validation_output->event_context_type) {
be514b0c 173 BT_LOGD("Creating initial event context field: ft-addr=%p",
3dca2276
PP
174 validation_output->event_context_type);
175 *context_field = create_field_func(
176 validation_output->event_context_type);
177 if (!*context_field) {
7b010242 178 BT_LOGE_STR("Cannot create initial event context field object.");
83509119 179 goto error;
662e778c 180 }
f655a84d 181 }
09840de5 182
3dca2276 183 if (validation_output->event_payload_type) {
be514b0c 184 BT_LOGD("Creating initial event payload field: ft-addr=%p",
3dca2276
PP
185 validation_output->event_payload_type);
186 *payload_field = create_field_func(
187 validation_output->event_payload_type);
188 if (!*payload_field) {
7b010242 189 BT_LOGE_STR("Cannot create initial event payload field object.");
09840de5
PP
190 goto error;
191 }
662e778c
JG
192 }
193
3dca2276
PP
194 goto end;
195
196error:
197 BT_PUT(*header_field);
198 BT_PUT(*stream_event_context_field);
199 BT_PUT(*context_field);
200 BT_PUT(*payload_field);
201 ret = -1;
202
203end:
204 return ret;
205}
206
207BT_HIDDEN
208int _bt_event_common_validate(struct bt_event_common *event)
209{
210 int ret = 0;
211 struct bt_stream_class_common *stream_class;
212
213 BT_ASSERT(event);
214 if (event->header_field) {
215 ret = bt_field_common_validate_recursive(event->header_field);
216 if (ret) {
217 BT_ASSERT_PRE_MSG("Invalid event's header field: "
218 "%![event-]+_e, %![field-]+_f",
219 event, event->header_field);
220 goto end;
221 }
222 }
223
224 stream_class = bt_event_class_common_borrow_stream_class(event->class);
225
226 /*
227 * We should not have been able to create the event without associating
228 * the event class to a stream class.
229 */
230 BT_ASSERT(stream_class);
231
232 if (stream_class->event_context_field_type) {
233 ret = bt_field_common_validate_recursive(
234 event->stream_event_context_field);
235 if (ret) {
236 BT_ASSERT_PRE_MSG("Invalid event's stream event context field: "
237 "%![event-]+_e, %![field-]+_f",
238 event, event->stream_event_context_field);
239 goto end;
240 }
241 }
242
243 if (event->class->context_field_type) {
244 ret = bt_field_common_validate_recursive(event->context_field);
245 if (ret) {
246 BT_ASSERT_PRE_MSG("Invalid event's payload field: "
247 "%![event-]+_e, %![field-]+_f",
248 event, event->context_field);
249 goto end;
250 }
251 }
252
253 ret = bt_field_common_validate_recursive(event->payload_field);
254 if (ret) {
255 BT_ASSERT_PRE_MSG("Invalid event's payload field: "
256 "%![event-]+_e, %![field-]+_f",
257 event, event->payload_field);
258 goto end;
259 }
260
261end:
262 return ret;
263}
264
265BT_HIDDEN
266void _bt_event_common_freeze(struct bt_event_common *event)
267{
268 BT_ASSERT(event);
269
270 if (event->frozen) {
271 return;
272 }
273
274 BT_LOGD("Freezing event: addr=%p, "
275 "event-class-name=\"%s\", event-class-id=%" PRId64,
276 event, bt_event_class_common_get_name(event->class),
277 bt_event_class_common_get_id(event->class));
278 BT_LOGD_STR("Freezing event's header field.");
279 bt_field_common_freeze_recursive(event->header_field);
280 BT_LOGD_STR("Freezing event's stream event context field.");
281 bt_field_common_freeze_recursive(event->stream_event_context_field);
282 BT_LOGD_STR("Freezing event's context field.");
283 bt_field_common_freeze_recursive(event->context_field);
284 BT_LOGD_STR("Freezing event's payload field.");
285 bt_field_common_freeze_recursive(event->payload_field);
286 event->frozen = 1;
287}
288
289BT_HIDDEN
290int bt_event_common_initialize(struct bt_event_common *event,
291 struct bt_event_class_common *event_class,
292 struct bt_clock_class *init_expected_clock_class,
293 bt_object_release_func release_func,
294 bt_validation_flag_copy_field_type_func field_type_copy_func,
295 bool must_be_in_trace,
296 int (*map_clock_classes_func)(struct bt_stream_class_common *stream_class,
297 struct bt_field_type_common *packet_context_field_type,
298 struct bt_field_type_common *event_header_field_type),
299 void *(*create_field_func)(void *))
300{
301 int ret;
302 struct bt_trace_common *trace = NULL;
303 struct bt_stream_class_common *stream_class = NULL;
304 struct bt_field_common *event_header = NULL;
305 struct bt_field_common *stream_event_context = NULL;
306 struct bt_field_common *event_context = NULL;
307 struct bt_field_common *event_payload = NULL;
308 struct bt_validation_output validation_output = { 0 };
309 struct bt_clock_class *expected_clock_class =
310 init_expected_clock_class ? bt_get(init_expected_clock_class) :
311 NULL;
312
313 BT_ASSERT_PRE_NON_NULL(event_class, "Event class");
314 BT_LOGD("Initializing common event object: event-class-addr=%p, "
315 "event-class-name=\"%s\", event-class-id=%" PRId64,
316 event_class, bt_event_class_common_get_name(event_class),
317 bt_event_class_common_get_id(event_class));
318
319 stream_class = bt_event_class_common_borrow_stream_class(event_class);
320 BT_ASSERT_PRE(stream_class,
321 "Event class is not part of a stream class: %!+_E", event_class);
322
323 /* The event class was frozen when added to its stream class */
324 BT_ASSERT(event_class->frozen);
325 trace = bt_stream_class_common_borrow_trace(stream_class);
326
327 if (must_be_in_trace) {
328 BT_ASSERT_PRE(trace,
329 "Event class's stream class is not part of a trace: "
330 "%![ec-]+_E, %![ec-]+_S", event_class, stream_class);
331 }
332
333 /*
334 * This must be called before anything that can fail because on
335 * failure, the caller releases the reference to `event` to
336 * destroy it.
337 */
338 bt_object_init(event, release_func);
339
340 if (!stream_class->frozen) {
341 /*
342 * Because this function freezes the stream class,
343 * validate that this stream class contains at most a
344 * single clock class so that we set its expected clock
345 * class for future checks.
346 */
347 ret = bt_stream_class_common_validate_single_clock_class(
348 stream_class, &expected_clock_class);
349 if (ret) {
350 BT_LOGW("Event class's stream class or one of its event "
351 "classes contains a field type which is not "
352 "recursively mapped to the expected "
353 "clock class: "
354 "stream-class-addr=%p, "
355 "stream-class-id=%" PRId64 ", "
356 "stream-class-name=\"%s\", "
357 "expected-clock-class-addr=%p, "
358 "expected-clock-class-name=\"%s\"",
359 stream_class,
360 bt_stream_class_common_get_id(stream_class),
361 bt_stream_class_common_get_name(stream_class),
362 expected_clock_class,
363 expected_clock_class ?
364 bt_clock_class_get_name(expected_clock_class) :
365 NULL);
366 goto error;
367 }
368 }
369
370 /* Validate the trace, the stream class, and the event class */
371 ret = bt_event_common_validate_types_for_create(
372 event_class, &validation_output, field_type_copy_func);
373 if (ret) {
374 /* bt_event_common_validate_types_for_create() logs errors */
375 goto error;
376 }
377
378 if (map_clock_classes_func) {
379 /*
380 * Safe to automatically map selected fields to the
381 * stream's clock's class here because the stream class
382 * is about to be frozen.
383 */
384 if (map_clock_classes_func(stream_class,
385 validation_output.packet_context_type,
386 validation_output.event_header_type)) {
387 BT_LOGW_STR("Cannot automatically map selected stream class's "
388 "field types to stream class's clock's class.");
389 goto error;
390 }
391 }
392
393 /*
394 * event does not share a common ancestor with the event class; it has
395 * to guarantee its existence by holding a reference. This reference
396 * shall be released once the event is associated to a stream since,
397 * from that point, the event and its class will share the same
398 * lifetime.
399 */
400 event->class = bt_get(event_class);
401
402 ret = bt_event_common_create_fields(&validation_output,
403 create_field_func, &event_header,
404 &stream_event_context, &event_context, &event_payload);
405 if (ret) {
406 /* bt_event_common_create_fields() logs errors */
407 goto error;
408 }
409
09840de5
PP
410 /*
411 * At this point all the fields are created, potentially from
412 * validated copies of field types, so that the field types and
413 * fields can be replaced in the trace, stream class,
414 * event class, and created event.
415 */
3dca2276
PP
416 bt_validation_replace_types(trace, stream_class, event_class,
417 &validation_output,
418 BT_VALIDATION_FLAG_STREAM | BT_VALIDATION_FLAG_EVENT);
419 BT_MOVE(event->header_field, event_header);
420 BT_MOVE(event->stream_event_context_field, stream_event_context);
421 BT_MOVE(event->context_field, event_context);
422 BT_MOVE(event->payload_field, event_payload);
09840de5
PP
423
424 /*
50842bdc 425 * Put what was not moved in bt_validation_replace_types().
09840de5 426 */
50842bdc 427 bt_validation_output_put_types(&validation_output);
09840de5 428
662e778c
JG
429 /*
430 * Freeze the stream class since the event header must not be changed
431 * anymore.
432 */
3dca2276 433 bt_stream_class_common_freeze(stream_class);
09840de5 434
2a3ced3c
PP
435 /*
436 * It is safe to set the stream class's unique clock class
437 * now because the stream class is frozen.
438 */
439 if (expected_clock_class) {
440 BT_MOVE(stream_class->clock_class, expected_clock_class);
441 }
442
09840de5
PP
443 /*
444 * Mark stream class, and event class as valid since
445 * they're all frozen now.
446 */
447 stream_class->valid = 1;
448 event_class->valid = 1;
449
450 /* Put stuff we borrowed from the event class */
3dca2276 451 BT_LOGD("Initialized event object: addr=%p, event-class-name=\"%s\", "
7b010242 452 "event-class-id=%" PRId64,
3dca2276
PP
453 event, bt_event_class_common_get_name(event->class),
454 bt_event_class_common_get_id(event->class));
455 goto end;
09840de5 456
83509119 457error:
50842bdc 458 bt_validation_output_put_types(&validation_output);
2a3ced3c 459 bt_put(expected_clock_class);
3dca2276
PP
460 bt_put(event_header);
461 bt_put(stream_event_context);
462 bt_put(event_context);
463 bt_put(event_payload);
464 ret = -1;
465
466end:
467 return ret;
468}
469
470struct bt_event *bt_event_create(struct bt_event_class *event_class)
471{
472 int ret;
473 struct bt_event *event = NULL;
474
475 event = g_new0(struct bt_event, 1);
476 if (!event) {
477 BT_LOGE_STR("Failed to allocate one event.");
478 goto error;
479 }
480
481 ret = bt_event_common_initialize(BT_TO_COMMON(event),
482 BT_TO_COMMON(event_class), NULL, bt_event_destroy,
483 (bt_validation_flag_copy_field_type_func) bt_field_type_copy,
484 true, NULL, (void *) bt_field_create);
485 if (ret) {
486 /* bt_event_common_initialize() logs errors */
487 goto error;
488 }
489
490 event->clock_values = g_hash_table_new_full(g_direct_hash,
094ff7c0 491 g_direct_equal, NULL, bt_put);
3dca2276
PP
492 assert(event->clock_values);
493 goto end;
494
495error:
496 BT_PUT(event);
497
498end:
83509119 499 return event;
273b65be
JG
500}
501
094ff7c0 502struct bt_event_class *bt_event_borrow_class(struct bt_event *event)
2f100782 503{
f6ccaed9 504 BT_ASSERT_PRE_NON_NULL(event, "Event");
094ff7c0
PP
505 return BT_FROM_COMMON(
506 bt_event_common_borrow_class(BT_TO_COMMON(event)));
2f100782
JG
507}
508
f6ccaed9 509struct bt_stream *bt_event_borrow_stream(struct bt_event *event)
f6ccaed9
PP
510{
511 BT_ASSERT_PRE_NON_NULL(event, "Event");
094ff7c0 512 return event->packet ? event->packet->stream : NULL;
f6ccaed9
PP
513}
514
094ff7c0 515struct bt_field *bt_event_borrow_payload(struct bt_event *event)
e5e6eb3a 516{
094ff7c0
PP
517 return BT_FROM_COMMON(
518 bt_event_common_borrow_payload(BT_TO_COMMON(event)));
e5e6eb3a
JG
519}
520
3dca2276 521int bt_event_set_payload(struct bt_event *event, struct bt_field *field)
273b65be 522{
3dca2276
PP
523 return bt_event_common_set_payload(BT_TO_COMMON(event),
524 (void *) field);
2f100782
JG
525}
526
094ff7c0 527struct bt_field *bt_event_borrow_header(struct bt_event *event)
662e778c 528{
094ff7c0
PP
529 return BT_FROM_COMMON(
530 bt_event_common_borrow_header(BT_TO_COMMON(event)));
662e778c
JG
531}
532
3dca2276 533int bt_event_set_header(struct bt_event *event, struct bt_field *field)
662e778c 534{
3dca2276 535 return bt_event_common_set_header(BT_TO_COMMON(event), (void *) field);
662e778c
JG
536}
537
094ff7c0 538struct bt_field *bt_event_borrow_context(struct bt_event *event)
f655a84d 539{
094ff7c0
PP
540 return BT_FROM_COMMON(
541 bt_event_common_borrow_context(BT_TO_COMMON(event)));
f655a84d
JG
542}
543
3dca2276 544int bt_event_set_context(struct bt_event *event, struct bt_field *field)
f655a84d 545{
3dca2276 546 return bt_event_common_set_context(BT_TO_COMMON(event), (void *) field);
f655a84d
JG
547}
548
094ff7c0 549struct bt_field *bt_event_borrow_stream_event_context(
50842bdc 550 struct bt_event *event)
5fd2e9fd 551{
094ff7c0 552 return BT_FROM_COMMON(bt_event_common_borrow_stream_event_context(
3dca2276 553 BT_TO_COMMON(event)));
5fd2e9fd
PP
554}
555
50842bdc 556int bt_event_set_stream_event_context(struct bt_event *event,
3dca2276 557 struct bt_field *field)
273b65be 558{
3dca2276
PP
559 return bt_event_common_set_stream_event_context(
560 BT_TO_COMMON(event), (void *) field);
273b65be
JG
561}
562
50842bdc 563void bt_event_destroy(struct bt_object *obj)
273b65be 564{
3dca2276 565 struct bt_event *event = (void *) obj;
7b010242 566
3dca2276 567 bt_event_common_finalize(obj);
41ac640a 568 g_hash_table_destroy(event->clock_values);
03039f21 569 BT_LOGD_STR("Putting event's packet.");
5c3b707d 570 bt_put(event->packet);
273b65be
JG
571 g_free(event);
572}
573
094ff7c0 574struct bt_clock_value *bt_event_borrow_clock_value(
50842bdc 575 struct bt_event *event, struct bt_clock_class *clock_class)
78586d8a 576{
50842bdc 577 struct bt_clock_value *clock_value = NULL;
78586d8a 578
f6ccaed9
PP
579 BT_ASSERT_PRE_NON_NULL(event, "Event");
580 BT_ASSERT_PRE_NON_NULL(clock_class, "Clock class");
ac0c6bdd 581 clock_value = g_hash_table_lookup(event->clock_values, clock_class);
78586d8a 582 if (!clock_value) {
7b010242
PP
583 BT_LOGV("No clock value associated to the given clock class: "
584 "event-addr=%p, event-class-name=\"%s\", "
585 "event-class-id=%" PRId64 ", clock-class-addr=%p, "
586 "clock-class-name=\"%s\"", event,
3dca2276
PP
587 bt_event_class_common_get_name(event->common.class),
588 bt_event_class_common_get_id(event->common.class),
50842bdc 589 clock_class, bt_clock_class_get_name(clock_class));
78586d8a
JG
590 goto end;
591 }
592
1556a1af
JG
593end:
594 return clock_value;
595}
596
50842bdc
PP
597int bt_event_set_clock_value(struct bt_event *event,
598 struct bt_clock_value *value)
662e778c 599{
50842bdc
PP
600 struct bt_trace *trace;
601 struct bt_stream_class *stream_class;
602 struct bt_event_class *event_class;
603 struct bt_clock_class *clock_class = NULL;
662e778c 604
f6ccaed9
PP
605 BT_ASSERT_PRE_NON_NULL(event, "Event");
606 BT_ASSERT_PRE_NON_NULL(value, "Clock value");
3dca2276 607 BT_ASSERT_PRE_EVENT_COMMON_HOT(BT_TO_COMMON(event), "Event");
094ff7c0 608 clock_class = bt_clock_value_borrow_class(value);
3dca2276 609 event_class = BT_FROM_COMMON(event->common.class);
f6ccaed9 610 BT_ASSERT(event_class);
50842bdc 611 stream_class = bt_event_class_borrow_stream_class(event_class);
f6ccaed9 612 BT_ASSERT(stream_class);
50842bdc 613 trace = bt_stream_class_borrow_trace(stream_class);
f6ccaed9 614 BT_ASSERT(trace);
3dca2276
PP
615 BT_ASSERT_PRE(bt_trace_common_has_clock_class(BT_TO_COMMON(trace),
616 clock_class),
f6ccaed9
PP
617 "Clock class is not part of event's trace: "
618 "%![event-]+e, %![clock-class-]+K",
619 event, clock_class);
c9d90a34 620 g_hash_table_insert(event->clock_values, clock_class, bt_get(value));
7b010242
PP
621 BT_LOGV("Set event's clock value: "
622 "event-addr=%p, event-class-name=\"%s\", "
623 "event-class-id=%" PRId64 ", clock-class-addr=%p, "
624 "clock-class-name=\"%s\", clock-value-addr=%p, "
625 "clock-value-cycles=%" PRIu64,
3dca2276
PP
626 event, bt_event_class_common_get_name(event->common.class),
627 bt_event_class_common_get_id(event->common.class),
50842bdc 628 clock_class, bt_clock_class_get_name(clock_class),
7b010242 629 value, value->value);
f6ccaed9 630 return 0;
662e778c
JG
631}
632
094ff7c0 633struct bt_packet *bt_event_borrow_packet(struct bt_event *event)
5c0f40f4 634{
50842bdc 635 struct bt_packet *packet = NULL;
5c0f40f4 636
f6ccaed9 637 BT_ASSERT_PRE_NON_NULL(event, "Event");
7b010242
PP
638 if (!event->packet) {
639 BT_LOGV("Event has no current packet: addr=%p, "
640 "event-class-name=\"%s\", event-class-id=%" PRId64,
3dca2276
PP
641 event, bt_event_class_common_get_name(event->common.class),
642 bt_event_class_common_get_id(event->common.class));
5c0f40f4
JG
643 goto end;
644 }
645
094ff7c0 646 packet = event->packet;
f6ccaed9 647
5c0f40f4
JG
648end:
649 return packet;
650}
651
50842bdc
PP
652int bt_event_set_packet(struct bt_event *event,
653 struct bt_packet *packet)
5c3b707d 654{
f6ccaed9
PP
655 BT_ASSERT_PRE_NON_NULL(event, "Event");
656 BT_ASSERT_PRE_NON_NULL(packet, "Packet");
3dca2276 657 BT_ASSERT_PRE_EVENT_COMMON_HOT(BT_TO_COMMON(event), "Event");
5c3b707d
PP
658
659 /*
660 * Make sure the new packet was created by this event's
661 * stream, if it is set.
662 */
f6ccaed9
PP
663 if (bt_event_borrow_stream(event)) {
664 BT_ASSERT_PRE(packet->stream == bt_event_borrow_stream(event),
665 "Packet's stream and event's stream differ: "
666 "%![event-]+e, %![packet-]+a",
667 event, packet);
5c3b707d 668 } else {
3dca2276
PP
669 BT_ASSERT_PRE(bt_event_class_borrow_stream_class(
670 BT_FROM_COMMON(event->common.class)) ==
671 BT_FROM_COMMON(packet->stream->common.stream_class),
f6ccaed9
PP
672 "Packet's stream class and event's stream class differ: "
673 "%![event-]+e, %![packet-]+a",
674 event, packet);
5c3b707d
PP
675 }
676
cacf3147
PP
677 bt_get(packet);
678 BT_MOVE(event->packet, packet);
7b010242
PP
679 BT_LOGV("Set event's packet: event-addr=%p, "
680 "event-class-name=\"%s\", event-class-id=%" PRId64 ", "
681 "packet-addr=%p",
3dca2276
PP
682 event, bt_event_class_common_get_name(event->common.class),
683 bt_event_class_common_get_id(event->common.class), packet);
f6ccaed9 684 return 0;
5c3b707d 685}
4ce9f9d0
PP
686
687BT_HIDDEN
f6ccaed9 688void _bt_event_freeze(struct bt_event *event)
4ce9f9d0 689{
3dca2276
PP
690 _bt_event_common_freeze(BT_TO_COMMON(event));
691 BT_LOGD_STR("Freezing event's packet.");
50842bdc 692 bt_packet_freeze(event->packet);
4ce9f9d0 693}
This page took 0.083889 seconds and 4 git commands to generate.