4 * Babeltrace CTF IR - Event
6 * Copyright 2013, 2014 Jérémie Galarneau <jeremie.galarneau@efficios.com>
8 * Author: Jérémie Galarneau <jeremie.galarneau@efficios.com>
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:
17 * The above copyright notice and this permission notice shall be included in
18 * all copies or substantial portions of the Software.
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
29 #define BT_LOG_TAG "EVENT"
30 #include <babeltrace/lib-logging-internal.h>
32 #include <babeltrace/ctf-ir/fields-internal.h>
33 #include <babeltrace/ctf-ir/field-types-internal.h>
34 #include <babeltrace/ctf-ir/clock-class.h>
35 #include <babeltrace/ctf-ir/clock-class-internal.h>
36 #include <babeltrace/ctf-ir/event-internal.h>
37 #include <babeltrace/ctf-ir/event-class.h>
38 #include <babeltrace/ctf-ir/event-class-internal.h>
39 #include <babeltrace/ctf-ir/stream-class.h>
40 #include <babeltrace/ctf-ir/stream-class-internal.h>
41 #include <babeltrace/ctf-ir/stream-internal.h>
42 #include <babeltrace/ctf-ir/packet.h>
43 #include <babeltrace/ctf-ir/packet-internal.h>
44 #include <babeltrace/ctf-ir/trace-internal.h>
45 #include <babeltrace/ctf-ir/validation-internal.h>
46 #include <babeltrace/ctf-ir/packet-internal.h>
47 #include <babeltrace/ctf-ir/utils.h>
48 #include <babeltrace/ctf-writer/serialize-internal.h>
49 #include <babeltrace/ref.h>
50 #include <babeltrace/ctf-ir/attributes-internal.h>
51 #include <babeltrace/compiler-internal.h>
55 void bt_ctf_event_destroy(struct bt_object
*obj
);
57 struct bt_ctf_event
*bt_ctf_event_create(struct bt_ctf_event_class
*event_class
)
60 enum bt_ctf_validation_flag validation_flags
=
61 BT_CTF_VALIDATION_FLAG_STREAM
|
62 BT_CTF_VALIDATION_FLAG_EVENT
;
63 struct bt_ctf_event
*event
= NULL
;
64 struct bt_ctf_trace
*trace
= NULL
;
65 struct bt_ctf_stream_class
*stream_class
= NULL
;
66 struct bt_ctf_field_type
*packet_header_type
= NULL
;
67 struct bt_ctf_field_type
*packet_context_type
= NULL
;
68 struct bt_ctf_field_type
*event_header_type
= NULL
;
69 struct bt_ctf_field_type
*stream_event_ctx_type
= NULL
;
70 struct bt_ctf_field_type
*event_context_type
= NULL
;
71 struct bt_ctf_field_type
*event_payload_type
= NULL
;
72 struct bt_ctf_field
*event_header
= NULL
;
73 struct bt_ctf_field
*stream_event_context
= NULL
;
74 struct bt_ctf_field
*event_context
= NULL
;
75 struct bt_ctf_field
*event_payload
= NULL
;
76 struct bt_value
*environment
= NULL
;
77 struct bt_ctf_validation_output validation_output
= { 0 };
80 BT_LOGD("Creating event object: event-class-addr=%p, "
81 "event-class-name=\"%s\", event-class-id=%" PRId64
,
82 event_class
, bt_ctf_event_class_get_name(event_class
),
83 bt_ctf_event_class_get_id(event_class
));
86 BT_LOGW_STR("Invalid parameter: event class is NULL.");
90 stream_class
= bt_ctf_event_class_get_stream_class(event_class
);
93 * We disallow the creation of an event if its event class has not been
94 * associated to a stream class.
97 BT_LOGW_STR("Event class is not part of a stream class.");
101 /* A stream class should always have an existing event header type */
102 assert(stream_class
->event_header_type
);
104 /* The event class was frozen when added to its stream class */
105 assert(event_class
->frozen
);
107 /* Validate the trace (if any), the stream class, and the event class */
108 trace
= bt_ctf_stream_class_get_trace(stream_class
);
110 BT_LOGD_STR("Event's class is part of a trace.");
111 packet_header_type
= bt_ctf_trace_get_packet_header_type(trace
);
112 trace_valid
= trace
->valid
;
114 environment
= trace
->environment
;
117 packet_context_type
= bt_ctf_stream_class_get_packet_context_type(
119 event_header_type
= bt_ctf_stream_class_get_event_header_type(
121 stream_event_ctx_type
= bt_ctf_stream_class_get_event_context_type(
123 event_context_type
= bt_ctf_event_class_get_context_type(event_class
);
124 event_payload_type
= bt_ctf_event_class_get_payload_type(event_class
);
125 ret
= bt_ctf_validate_class_types(environment
, packet_header_type
,
126 packet_context_type
, event_header_type
, stream_event_ctx_type
,
127 event_context_type
, event_payload_type
, trace_valid
,
128 stream_class
->valid
, event_class
->valid
,
129 &validation_output
, validation_flags
);
130 BT_PUT(packet_header_type
);
131 BT_PUT(packet_context_type
);
132 BT_PUT(event_header_type
);
133 BT_PUT(stream_event_ctx_type
);
134 BT_PUT(event_context_type
);
135 BT_PUT(event_payload_type
);
138 * This means something went wrong during the validation
139 * process, not that the objects are invalid.
141 BT_LOGE("Failed to validate event and parents: ret=%d", ret
);
145 if ((validation_output
.valid_flags
& validation_flags
) !=
147 /* Invalid trace/stream class/event class */
148 BT_LOGW("Invalid trace, stream class, or event class: "
149 "valid-flags=0x%x", validation_output
.valid_flags
);
154 * At this point we know the trace (if associated to the stream
155 * class), the stream class, and the event class, with their
156 * current types, are valid. We may proceed with creating
159 event
= g_new0(struct bt_ctf_event
, 1);
161 BT_LOGE_STR("Failed to allocate one event.");
165 bt_object_init(event
, bt_ctf_event_destroy
);
168 * event does not share a common ancestor with the event class; it has
169 * to guarantee its existence by holding a reference. This reference
170 * shall be released once the event is associated to a stream since,
171 * from that point, the event and its class will share the same
174 event
->event_class
= bt_get(event_class
);
175 event
->clock_values
= g_hash_table_new_full(g_direct_hash
,
176 g_direct_equal
, bt_put
, bt_put
);
178 if (validation_output
.event_header_type
) {
179 BT_LOGD("Creating initial event header field: ft-addr=%p",
180 validation_output
.event_header_type
);
182 bt_ctf_field_create(validation_output
.event_header_type
);
184 BT_LOGE_STR("Cannot create initial event header field object.");
189 if (validation_output
.stream_event_ctx_type
) {
190 BT_LOGD("Creating initial stream event context field: ft-addr=%p",
191 validation_output
.stream_event_ctx_type
);
192 stream_event_context
= bt_ctf_field_create(
193 validation_output
.stream_event_ctx_type
);
194 if (!stream_event_context
) {
195 BT_LOGE_STR("Cannot create initial stream event context field object.");
200 if (validation_output
.event_context_type
) {
201 BT_LOGD("Creating initial event context field: ft-addr=%p",
202 validation_output
.event_context_type
);
203 event_context
= bt_ctf_field_create(
204 validation_output
.event_context_type
);
205 if (!event_context
) {
206 BT_LOGE_STR("Cannot create initial event context field object.");
211 if (validation_output
.event_payload_type
) {
212 BT_LOGD("Creating initial event payload field: ft-addr=%p",
213 validation_output
.event_payload_type
);
214 event_payload
= bt_ctf_field_create(
215 validation_output
.event_payload_type
);
216 if (!event_payload
) {
217 BT_LOGE_STR("Cannot create initial event payload field object.");
223 * At this point all the fields are created, potentially from
224 * validated copies of field types, so that the field types and
225 * fields can be replaced in the trace, stream class,
226 * event class, and created event.
228 bt_ctf_validation_replace_types(trace
, stream_class
,
229 event_class
, &validation_output
, validation_flags
);
230 BT_MOVE(event
->event_header
, event_header
);
231 BT_MOVE(event
->stream_event_context
, stream_event_context
);
232 BT_MOVE(event
->context_payload
, event_context
);
233 BT_MOVE(event
->fields_payload
, event_payload
);
236 * Put what was not moved in bt_ctf_validation_replace_types().
238 bt_ctf_validation_output_put_types(&validation_output
);
241 * Freeze the stream class since the event header must not be changed
244 bt_ctf_stream_class_freeze(stream_class
);
247 * Mark stream class, and event class as valid since
248 * they're all frozen now.
250 stream_class
->valid
= 1;
251 event_class
->valid
= 1;
253 /* Put stuff we borrowed from the event class */
254 BT_PUT(stream_class
);
256 BT_LOGD("Created event object: addr=%p, event-class-name=\"%s\", "
257 "event-class-id=%" PRId64
,
258 event
, bt_ctf_event_class_get_name(event
->event_class
),
259 bt_ctf_event_class_get_id(event_class
));
263 bt_ctf_validation_output_put_types(&validation_output
);
265 BT_PUT(stream_class
);
267 BT_PUT(event_header
);
268 BT_PUT(stream_event_context
);
269 BT_PUT(event_context
);
270 BT_PUT(event_payload
);
271 assert(!packet_header_type
);
272 assert(!packet_context_type
);
273 assert(!event_header_type
);
274 assert(!stream_event_ctx_type
);
275 assert(!event_context_type
);
276 assert(!event_payload_type
);
281 struct bt_ctf_event_class
*bt_ctf_event_get_class(struct bt_ctf_event
*event
)
283 struct bt_ctf_event_class
*event_class
= NULL
;
286 BT_LOGW_STR("Invalid parameter: event is NULL.");
290 event_class
= event
? bt_get(bt_ctf_event_borrow_event_class(event
)) :
296 struct bt_ctf_stream
*bt_ctf_event_get_stream(struct bt_ctf_event
*event
)
298 struct bt_ctf_stream
*stream
= NULL
;
301 BT_LOGW_STR("Invalid parameter: event is NULL.");
306 * If the event has a parent, then this is its (writer) stream.
307 * If the event has no parent, then if it has a packet, this
308 * is its (non-writer) stream.
310 if (event
->base
.parent
) {
311 stream
= (struct bt_ctf_stream
*) bt_object_get_parent(event
);
314 stream
= bt_get(event
->packet
->stream
);
322 int bt_ctf_event_set_payload(struct bt_ctf_event
*event
,
324 struct bt_ctf_field
*payload
)
328 if (!event
|| !payload
) {
329 BT_LOGW("Invalid parameter: event or payload field is NULL: "
330 "event-addr=%p, payload-field-addr=%p",
337 BT_LOGW("Invalid parameter: event is frozen: addr=%p, "
338 "event-class-name=\"%s\", event-class-id=%" PRId64
,
339 event
, bt_ctf_event_class_get_name(event
->event_class
),
340 bt_ctf_event_class_get_id(event
->event_class
));
346 ret
= bt_ctf_field_structure_set_field(event
->fields_payload
,
349 struct bt_ctf_field_type
*payload_type
;
351 payload_type
= bt_ctf_field_get_type(payload
);
353 if (bt_ctf_field_type_compare(payload_type
,
354 event
->event_class
->fields
) == 0) {
355 bt_put(event
->fields_payload
);
357 event
->fields_payload
= payload
;
359 BT_LOGW("Invalid parameter: payload field type is different from the expected field type: "
360 "event-addr=%p, event-class-name=\"%s\", "
361 "event-class-id=%" PRId64
,
363 bt_ctf_event_class_get_name(event
->event_class
),
364 bt_ctf_event_class_get_id(event
->event_class
));
368 bt_put(payload_type
);
372 BT_LOGW("Failed to set event's payload field: event-addr=%p, "
373 "event-class-name=\"%s\", event-class-id=%" PRId64
", "
374 "payload-field-name=\"%s\", payload-field-addr=%p",
375 event
, bt_ctf_event_class_get_name(event
->event_class
),
376 bt_ctf_event_class_get_id(event
->event_class
),
379 BT_LOGV("Set event's payload field: event-addr=%p, "
380 "event-class-name=\"%s\", event-class-id=%" PRId64
", "
381 "payload-field-name=\"%s\", payload-field-addr=%p",
382 event
, bt_ctf_event_class_get_name(event
->event_class
),
383 bt_ctf_event_class_get_id(event
->event_class
),
391 struct bt_ctf_field
*bt_ctf_event_get_event_payload(struct bt_ctf_event
*event
)
393 struct bt_ctf_field
*payload
= NULL
;
396 BT_LOGW_STR("Invalid parameter: event is NULL.");
400 if (!event
->fields_payload
) {
401 BT_LOGV("Event has no current payload field: addr=%p, "
402 "event-class-name=\"%s\", event-class-id=%" PRId64
,
403 event
, bt_ctf_event_class_get_name(event
->event_class
),
404 bt_ctf_event_class_get_id(event
->event_class
));
408 payload
= event
->fields_payload
;
414 int bt_ctf_event_set_event_payload(struct bt_ctf_event
*event
,
415 struct bt_ctf_field
*payload
)
417 return bt_ctf_event_set_payload(event
, NULL
, payload
);
420 struct bt_ctf_field
*bt_ctf_event_get_payload(struct bt_ctf_event
*event
,
423 struct bt_ctf_field
*field
= NULL
;
426 BT_LOGW_STR("Invalid parameter: event is NULL.");
431 field
= bt_ctf_field_structure_get_field(event
->fields_payload
,
434 field
= event
->fields_payload
;
441 struct bt_ctf_field
*bt_ctf_event_get_payload_by_index(
442 struct bt_ctf_event
*event
, uint64_t index
)
444 struct bt_ctf_field
*field
= NULL
;
447 BT_LOGW_STR("Invalid parameter: event is NULL.");
451 field
= bt_ctf_field_structure_get_field_by_index(event
->fields_payload
,
457 struct bt_ctf_field
*bt_ctf_event_get_header(
458 struct bt_ctf_event
*event
)
460 struct bt_ctf_field
*header
= NULL
;
463 BT_LOGW_STR("Invalid parameter: event is NULL.");
467 if (!event
->event_header
) {
468 BT_LOGV("Event has no current header field: addr=%p, "
469 "event-class-name=\"%s\", event-class-id=%" PRId64
,
470 event
, bt_ctf_event_class_get_name(event
->event_class
),
471 bt_ctf_event_class_get_id(event
->event_class
));
475 header
= event
->event_header
;
481 int bt_ctf_event_set_header(struct bt_ctf_event
*event
,
482 struct bt_ctf_field
*header
)
485 struct bt_ctf_field_type
*field_type
= NULL
;
486 struct bt_ctf_stream_class
*stream_class
= NULL
;
489 BT_LOGW_STR("Invalid parameter: event is NULL.");
495 BT_LOGW("Invalid parameter: event is frozen: addr=%p, "
496 "event-class-name=\"%s\", event-class-id=%" PRId64
,
497 event
, bt_ctf_event_class_get_name(event
->event_class
),
498 bt_ctf_event_class_get_id(event
->event_class
));
503 stream_class
= (struct bt_ctf_stream_class
*) bt_object_get_parent(
506 * Ensure the provided header's type matches the one registered to the
510 field_type
= bt_ctf_field_get_type(header
);
511 if (bt_ctf_field_type_compare(field_type
,
512 stream_class
->event_header_type
)) {
513 BT_LOGW("Invalid parameter: header field type is different from the expected field type: "
514 "event-addr=%p, event-class-name=\"%s\", "
515 "event-class-id=%" PRId64
,
517 bt_ctf_event_class_get_name(event
->event_class
),
518 bt_ctf_event_class_get_id(event
->event_class
));
523 if (stream_class
->event_header_type
) {
524 BT_LOGW("Invalid parameter: setting no event header but event header field type is not NULL: "
525 "event-addr=%p, event-class-name=\"%s\", "
526 "event-class-id=%" PRId64
", "
527 "event-header-ft-addr=%p",
529 bt_ctf_event_class_get_name(event
->event_class
),
530 bt_ctf_event_class_get_id(event
->event_class
),
531 stream_class
->event_header_type
);
537 bt_put(event
->event_header
);
538 event
->event_header
= bt_get(header
);
539 BT_LOGV("Set event's header field: event-addr=%p, "
540 "event-class-name=\"%s\", event-class-id=%" PRId64
", "
541 "header-field-addr=%p",
542 event
, bt_ctf_event_class_get_name(event
->event_class
),
543 bt_ctf_event_class_get_id(event
->event_class
), header
);
545 bt_put(stream_class
);
550 struct bt_ctf_field
*bt_ctf_event_get_event_context(
551 struct bt_ctf_event
*event
)
553 struct bt_ctf_field
*context
= NULL
;
556 BT_LOGW_STR("Invalid parameter: event is NULL.");
560 if (!event
->context_payload
) {
561 BT_LOGV("Event has no current context field: addr=%p, "
562 "event-class-name=\"%s\", event-class-id=%" PRId64
,
563 event
, bt_ctf_event_class_get_name(event
->event_class
),
564 bt_ctf_event_class_get_id(event
->event_class
));
568 context
= event
->context_payload
;
574 int bt_ctf_event_set_event_context(struct bt_ctf_event
*event
,
575 struct bt_ctf_field
*context
)
578 struct bt_ctf_field_type
*field_type
= NULL
;
581 BT_LOGW_STR("Invalid parameter: event is NULL.");
587 BT_LOGW("Invalid parameter: event is frozen: addr=%p, "
588 "event-class-name=\"%s\", event-class-id=%" PRId64
,
589 event
, bt_ctf_event_class_get_name(event
->event_class
),
590 bt_ctf_event_class_get_id(event
->event_class
));
596 field_type
= bt_ctf_field_get_type(context
);
598 if (bt_ctf_field_type_compare(field_type
,
599 event
->event_class
->context
)) {
600 BT_LOGW("Invalid parameter: context field type is different from the expected field type: "
601 "event-addr=%p, event-class-name=\"%s\", "
602 "event-class-id=%" PRId64
,
604 bt_ctf_event_class_get_name(event
->event_class
),
605 bt_ctf_event_class_get_id(event
->event_class
));
610 if (event
->event_class
->context
) {
611 BT_LOGW("Invalid parameter: setting no event context but event context field type is not NULL: "
612 "event-addr=%p, event-class-name=\"%s\", "
613 "event-class-id=%" PRId64
", "
614 "event-context-ft-addr=%p",
616 bt_ctf_event_class_get_name(event
->event_class
),
617 bt_ctf_event_class_get_id(event
->event_class
),
618 event
->event_class
->context
);
624 bt_put(event
->context_payload
);
625 event
->context_payload
= bt_get(context
);
626 BT_LOGV("Set event's context field: event-addr=%p, "
627 "event-class-name=\"%s\", event-class-id=%" PRId64
", "
628 "context-field-addr=%p",
629 event
, bt_ctf_event_class_get_name(event
->event_class
),
630 bt_ctf_event_class_get_id(event
->event_class
), context
);
636 struct bt_ctf_field
*bt_ctf_event_get_stream_event_context(
637 struct bt_ctf_event
*event
)
639 struct bt_ctf_field
*stream_event_context
= NULL
;
642 BT_LOGW_STR("Invalid parameter: event is NULL.");
646 if (!event
->stream_event_context
) {
647 BT_LOGV("Event has no current stream event context field: addr=%p, "
648 "event-class-name=\"%s\", event-class-id=%" PRId64
,
649 event
, bt_ctf_event_class_get_name(event
->event_class
),
650 bt_ctf_event_class_get_id(event
->event_class
));
654 stream_event_context
= event
->stream_event_context
;
656 return bt_get(stream_event_context
);
659 int bt_ctf_event_set_stream_event_context(struct bt_ctf_event
*event
,
660 struct bt_ctf_field
*stream_event_context
)
663 struct bt_ctf_field_type
*field_type
= NULL
;
664 struct bt_ctf_stream_class
*stream_class
= NULL
;
667 BT_LOGW_STR("Invalid parameter: event is NULL.");
673 BT_LOGW("Invalid parameter: event is frozen: addr=%p, "
674 "event-class-name=\"%s\", event-class-id=%" PRId64
,
675 event
, bt_ctf_event_class_get_name(event
->event_class
),
676 bt_ctf_event_class_get_id(event
->event_class
));
681 stream_class
= bt_ctf_event_class_get_stream_class(event
->event_class
);
683 * We should not have been able to create the event without associating
684 * the event class to a stream class.
686 assert(stream_class
);
688 if (stream_event_context
) {
689 field_type
= bt_ctf_field_get_type(stream_event_context
);
690 if (bt_ctf_field_type_compare(field_type
,
691 stream_class
->event_context_type
)) {
692 BT_LOGW("Invalid parameter: stream event context field type is different from the expected field type: "
693 "event-addr=%p, event-class-name=\"%s\", "
694 "event-class-id=%" PRId64
,
696 bt_ctf_event_class_get_name(event
->event_class
),
697 bt_ctf_event_class_get_id(event
->event_class
));
702 if (stream_class
->event_context_type
) {
703 BT_LOGW("Invalid parameter: setting no stream event context but stream event context field type is not NULL: "
704 "event-addr=%p, event-class-name=\"%s\", "
705 "event-class-id=%" PRId64
", "
706 "stream-event-context-ft-addr=%p",
708 bt_ctf_event_class_get_name(event
->event_class
),
709 bt_ctf_event_class_get_id(event
->event_class
),
710 stream_class
->event_context_type
);
716 bt_get(stream_event_context
);
717 BT_MOVE(event
->stream_event_context
, stream_event_context
);
718 BT_LOGV("Set event's stream event context field: event-addr=%p, "
719 "event-class-name=\"%s\", event-class-id=%" PRId64
", "
720 "stream-event-context-field-addr=%p",
721 event
, bt_ctf_event_class_get_name(event
->event_class
),
722 bt_ctf_event_class_get_id(event
->event_class
),
723 stream_event_context
);
725 BT_PUT(stream_class
);
730 /* Pre-2.0 CTF writer backward compatibility */
731 void bt_ctf_event_get(struct bt_ctf_event
*event
)
736 /* Pre-2.0 CTF writer backward compatibility */
737 void bt_ctf_event_put(struct bt_ctf_event
*event
)
742 void bt_ctf_event_destroy(struct bt_object
*obj
)
744 struct bt_ctf_event
*event
;
746 event
= container_of(obj
, struct bt_ctf_event
, base
);
747 BT_LOGD("Destroying event: addr=%p, "
748 "event-class-name=\"%s\", event-class-id=%" PRId64
,
749 event
, bt_ctf_event_class_get_name(event
->event_class
),
750 bt_ctf_event_class_get_id(event
->event_class
));
752 if (!event
->base
.parent
) {
754 * Event was keeping a reference to its class since it shared no
755 * common ancestor with it to guarantee they would both have the
758 bt_put(event
->event_class
);
760 g_hash_table_destroy(event
->clock_values
);
761 BT_LOGD_STR("Putting event's header field.");
762 bt_put(event
->event_header
);
763 BT_LOGD_STR("Putting event's stream event context field.");
764 bt_put(event
->stream_event_context
);
765 BT_LOGD_STR("Putting event's context field.");
766 bt_put(event
->context_payload
);
767 BT_LOGD_STR("Putting event's payload field.");
768 bt_put(event
->fields_payload
);
769 BT_LOGD_STR("Putting event's packet.");
770 bt_put(event
->packet
);
774 struct bt_ctf_clock_value
*bt_ctf_event_get_clock_value(
775 struct bt_ctf_event
*event
, struct bt_ctf_clock_class
*clock_class
)
777 struct bt_ctf_clock_value
*clock_value
= NULL
;
779 if (!event
|| !clock_class
) {
780 BT_LOGW("Invalid parameter: event or clock class is NULL: "
781 "event-addr=%p, clock-class-addr=%p",
786 clock_value
= g_hash_table_lookup(event
->clock_values
, clock_class
);
788 BT_LOGV("No clock value associated to the given clock class: "
789 "event-addr=%p, event-class-name=\"%s\", "
790 "event-class-id=%" PRId64
", clock-class-addr=%p, "
791 "clock-class-name=\"%s\"", event
,
792 bt_ctf_event_class_get_name(event
->event_class
),
793 bt_ctf_event_class_get_id(event
->event_class
),
794 clock_class
, bt_ctf_clock_class_get_name(clock_class
));
803 int bt_ctf_event_set_clock_value(struct bt_ctf_event
*event
,
804 struct bt_ctf_clock_value
*value
)
807 struct bt_ctf_trace
*trace
;
808 struct bt_ctf_stream_class
*stream_class
;
809 struct bt_ctf_event_class
*event_class
;
810 struct bt_ctf_clock_class
*clock_class
= NULL
;
812 if (!event
|| !value
) {
813 BT_LOGW("Invalid parameter: event or clock value is NULL: "
814 "event-addr=%p, clock-value-addr=%p",
821 BT_LOGW("Invalid parameter: event is frozen: addr=%p, "
822 "event-class-name=\"%s\", event-class-id=%" PRId64
,
823 event
, bt_ctf_event_class_get_name(event
->event_class
),
824 bt_ctf_event_class_get_id(event
->event_class
));
829 clock_class
= bt_ctf_clock_value_get_class(value
);
830 event_class
= bt_ctf_event_borrow_event_class(event
);
832 stream_class
= bt_ctf_event_class_borrow_stream_class(event_class
);
833 assert(stream_class
);
834 trace
= bt_ctf_stream_class_borrow_trace(stream_class
);
837 if (!bt_ctf_trace_has_clock_class(trace
, clock_class
)) {
838 BT_LOGW("Invalid parameter: clock class is not part of event's trace: "
839 "event-addr=%p, event-class-name=\"%s\", "
840 "event-class-id=%" PRId64
", clock-class-addr=%p, "
841 "clock-class-name=\"%s\"",
842 event
, bt_ctf_event_class_get_name(event
->event_class
),
843 bt_ctf_event_class_get_id(event
->event_class
),
844 clock_class
, bt_ctf_clock_class_get_name(clock_class
));
849 g_hash_table_insert(event
->clock_values
, clock_class
, bt_get(value
));
850 BT_LOGV("Set event's clock value: "
851 "event-addr=%p, event-class-name=\"%s\", "
852 "event-class-id=%" PRId64
", clock-class-addr=%p, "
853 "clock-class-name=\"%s\", clock-value-addr=%p, "
854 "clock-value-cycles=%" PRIu64
,
855 event
, bt_ctf_event_class_get_name(event
->event_class
),
856 bt_ctf_event_class_get_id(event
->event_class
),
857 clock_class
, bt_ctf_clock_class_get_name(clock_class
),
858 value
, value
->value
);
867 int bt_ctf_event_validate(struct bt_ctf_event
*event
)
869 /* Make sure each field's payload has been set */
871 struct bt_ctf_stream_class
*stream_class
= NULL
;
874 ret
= bt_ctf_field_validate(event
->event_header
);
876 BT_LOGD("Invalid event's header field: "
877 "event-addr=%p, event-class-name=\"%s\", "
878 "event-class-id=%" PRId64
,
879 event
, bt_ctf_event_class_get_name(event
->event_class
),
880 bt_ctf_event_class_get_id(event
->event_class
));
884 stream_class
= bt_ctf_event_class_get_stream_class(event
->event_class
);
886 * We should not have been able to create the event without associating
887 * the event class to a stream class.
889 assert(stream_class
);
890 if (stream_class
->event_context_type
) {
891 ret
= bt_ctf_field_validate(event
->stream_event_context
);
893 BT_LOGD("Invalid event's stream event context field: "
894 "event-addr=%p, event-class-name=\"%s\", "
895 "event-class-id=%" PRId64
,
897 bt_ctf_event_class_get_name(event
->event_class
),
898 bt_ctf_event_class_get_id(event
->event_class
));
903 ret
= bt_ctf_field_validate(event
->fields_payload
);
905 BT_LOGD("Invalid event's payload field: "
906 "event-addr=%p, event-class-name=\"%s\", "
907 "event-class-id=%" PRId64
,
909 bt_ctf_event_class_get_name(event
->event_class
),
910 bt_ctf_event_class_get_id(event
->event_class
));
914 if (event
->event_class
->context
) {
915 BT_LOGD("Invalid event's context field: "
916 "event-addr=%p, event-class-name=\"%s\", "
917 "event-class-id=%" PRId64
,
919 bt_ctf_event_class_get_name(event
->event_class
),
920 bt_ctf_event_class_get_id(event
->event_class
));
921 ret
= bt_ctf_field_validate(event
->context_payload
);
924 bt_put(stream_class
);
929 int bt_ctf_event_serialize(struct bt_ctf_event
*event
,
930 struct bt_ctf_stream_pos
*pos
,
931 enum bt_ctf_byte_order native_byte_order
)
938 BT_LOGV_STR("Serializing event's context field.");
939 if (event
->context_payload
) {
940 ret
= bt_ctf_field_serialize(event
->context_payload
, pos
,
943 BT_LOGW("Cannot serialize event's context field: "
944 "event-addr=%p, event-class-name=\"%s\", "
945 "event-class-id=%" PRId64
,
947 bt_ctf_event_class_get_name(event
->event_class
),
948 bt_ctf_event_class_get_id(event
->event_class
));
953 BT_LOGV_STR("Serializing event's payload field.");
954 if (event
->fields_payload
) {
955 ret
= bt_ctf_field_serialize(event
->fields_payload
, pos
,
958 BT_LOGW("Cannot serialize event's payload field: "
959 "event-addr=%p, event-class-name=\"%s\", "
960 "event-class-id=%" PRId64
,
962 bt_ctf_event_class_get_name(event
->event_class
),
963 bt_ctf_event_class_get_id(event
->event_class
));
971 struct bt_ctf_packet
*bt_ctf_event_get_packet(struct bt_ctf_event
*event
)
973 struct bt_ctf_packet
*packet
= NULL
;
976 BT_LOGW_STR("Invalid parameter: event is NULL.");
980 if (!event
->packet
) {
981 BT_LOGV("Event has no current packet: addr=%p, "
982 "event-class-name=\"%s\", event-class-id=%" PRId64
,
983 event
, bt_ctf_event_class_get_name(event
->event_class
),
984 bt_ctf_event_class_get_id(event
->event_class
));
988 packet
= bt_get(event
->packet
);
993 int bt_ctf_event_set_packet(struct bt_ctf_event
*event
,
994 struct bt_ctf_packet
*packet
)
996 struct bt_ctf_stream_class
*event_stream_class
= NULL
;
997 struct bt_ctf_stream_class
*packet_stream_class
= NULL
;
998 struct bt_ctf_stream
*stream
= NULL
;
1001 if (!event
|| !packet
) {
1002 BT_LOGW("Invalid parameter: event or packet is NULL: "
1003 "event-addr=%p, packet-addr=%p",
1009 if (event
->frozen
) {
1010 BT_LOGW("Invalid parameter: event is frozen: addr=%p, "
1011 "event-class-name=\"%s\", event-class-id=%" PRId64
,
1012 event
, bt_ctf_event_class_get_name(event
->event_class
),
1013 bt_ctf_event_class_get_id(event
->event_class
));
1019 * Make sure the new packet was created by this event's
1020 * stream, if it is set.
1022 stream
= bt_ctf_event_get_stream(event
);
1024 if (packet
->stream
!= stream
) {
1025 BT_LOGW("Invalid parameter: packet's stream and event's stream differ: "
1026 "event-addr=%p, event-class-name=\"%s\", "
1027 "event-class-id=%" PRId64
", packet-stream-addr=%p, "
1028 "event-stream-addr=%p",
1029 event
, bt_ctf_event_class_get_name(event
->event_class
),
1030 bt_ctf_event_class_get_id(event
->event_class
),
1031 packet
->stream
, stream
);
1036 event_stream_class
=
1037 bt_ctf_event_class_get_stream_class(event
->event_class
);
1038 packet_stream_class
=
1039 bt_ctf_stream_get_class(packet
->stream
);
1041 assert(event_stream_class
);
1042 assert(packet_stream_class
);
1044 if (event_stream_class
!= packet_stream_class
) {
1045 BT_LOGW("Invalid parameter: packet's stream class and event's stream class differ: "
1046 "event-addr=%p, event-class-name=\"%s\", "
1047 "event-class-id=%" PRId64
", packet-stream-class-addr=%p, "
1048 "event-stream-class-addr=%p",
1049 event
, bt_ctf_event_class_get_name(event
->event_class
),
1050 bt_ctf_event_class_get_id(event
->event_class
),
1051 packet_stream_class
, event_stream_class
);
1058 BT_MOVE(event
->packet
, packet
);
1059 BT_LOGV("Set event's packet: event-addr=%p, "
1060 "event-class-name=\"%s\", event-class-id=%" PRId64
", "
1062 event
, bt_ctf_event_class_get_name(event
->event_class
),
1063 bt_ctf_event_class_get_id(event
->event_class
), packet
);
1067 BT_PUT(event_stream_class
);
1068 BT_PUT(packet_stream_class
);
1074 void bt_ctf_event_freeze(struct bt_ctf_event
*event
)
1078 if (event
->frozen
) {
1082 BT_LOGD("Freezing event: addr=%p, "
1083 "event-class-name=\"%s\", event-class-id=%" PRId64
,
1084 event
, bt_ctf_event_class_get_name(event
->event_class
),
1085 bt_ctf_event_class_get_id(event
->event_class
));
1086 bt_ctf_packet_freeze(event
->packet
);
1087 BT_LOGD_STR("Freezing event's header field.");
1088 bt_ctf_field_freeze(event
->event_header
);
1089 BT_LOGD_STR("Freezing event's stream event context field.");
1090 bt_ctf_field_freeze(event
->stream_event_context
);
1091 BT_LOGD_STR("Freezing event's context field.");
1092 bt_ctf_field_freeze(event
->context_payload
);
1093 BT_LOGD_STR("Freezing event's payload field.");
1094 bt_ctf_field_freeze(event
->fields_payload
);