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 bt_ctf_field_create(validation_output
.event_header_type
);
180 BT_LOGE_STR("Cannot create initial event header field object.");
184 if (validation_output
.stream_event_ctx_type
) {
185 stream_event_context
= bt_ctf_field_create(
186 validation_output
.stream_event_ctx_type
);
187 if (!stream_event_context
) {
188 BT_LOGE_STR("Cannot create initial stream event context field object.");
193 if (validation_output
.event_context_type
) {
194 event_context
= bt_ctf_field_create(
195 validation_output
.event_context_type
);
196 if (!event_context
) {
197 BT_LOGE_STR("Cannot create initial event context field object.");
202 if (validation_output
.event_payload_type
) {
203 event_payload
= bt_ctf_field_create(
204 validation_output
.event_payload_type
);
205 if (!event_payload
) {
206 BT_LOGE_STR("Cannot create initial event payload field object.");
212 * At this point all the fields are created, potentially from
213 * validated copies of field types, so that the field types and
214 * fields can be replaced in the trace, stream class,
215 * event class, and created event.
217 bt_ctf_validation_replace_types(trace
, stream_class
,
218 event_class
, &validation_output
, validation_flags
);
219 BT_MOVE(event
->event_header
, event_header
);
220 BT_MOVE(event
->stream_event_context
, stream_event_context
);
221 BT_MOVE(event
->context_payload
, event_context
);
222 BT_MOVE(event
->fields_payload
, event_payload
);
225 * Put what was not moved in bt_ctf_validation_replace_types().
227 bt_ctf_validation_output_put_types(&validation_output
);
230 * Freeze the stream class since the event header must not be changed
233 bt_ctf_stream_class_freeze(stream_class
);
236 * Mark stream class, and event class as valid since
237 * they're all frozen now.
239 stream_class
->valid
= 1;
240 event_class
->valid
= 1;
242 /* Put stuff we borrowed from the event class */
243 BT_PUT(stream_class
);
245 BT_LOGD("Created event object: addr=%p, event-class-name=\"%s\", "
246 "event-class-id=%" PRId64
,
247 event
, bt_ctf_event_class_get_name(event
->event_class
),
248 bt_ctf_event_class_get_id(event_class
));
252 bt_ctf_validation_output_put_types(&validation_output
);
254 BT_PUT(stream_class
);
256 BT_PUT(event_header
);
257 BT_PUT(stream_event_context
);
258 BT_PUT(event_context
);
259 BT_PUT(event_payload
);
260 assert(!packet_header_type
);
261 assert(!packet_context_type
);
262 assert(!event_header_type
);
263 assert(!stream_event_ctx_type
);
264 assert(!event_context_type
);
265 assert(!event_payload_type
);
270 struct bt_ctf_event_class
*bt_ctf_event_get_class(struct bt_ctf_event
*event
)
272 struct bt_ctf_event_class
*event_class
= NULL
;
275 BT_LOGW_STR("Invalid parameter: event is NULL.");
279 event_class
= event
? bt_get(bt_ctf_event_borrow_event_class(event
)) :
285 struct bt_ctf_stream
*bt_ctf_event_get_stream(struct bt_ctf_event
*event
)
287 struct bt_ctf_stream
*stream
= NULL
;
290 BT_LOGW_STR("Invalid parameter: event is NULL.");
295 * If the event has a parent, then this is its (writer) stream.
296 * If the event has no parent, then if it has a packet, this
297 * is its (non-writer) stream.
299 if (event
->base
.parent
) {
300 stream
= (struct bt_ctf_stream
*) bt_object_get_parent(event
);
303 stream
= bt_get(event
->packet
->stream
);
311 int bt_ctf_event_set_payload(struct bt_ctf_event
*event
,
313 struct bt_ctf_field
*payload
)
317 if (!event
|| !payload
) {
318 BT_LOGW("Invalid parameter: event or payload field is NULL: "
319 "event-addr=%p, payload-field-addr=%p",
326 BT_LOGW("Invalid parameter: event is frozen: addr=%p, "
327 "event-class-name=\"%s\", event-class-id=%" PRId64
,
328 event
, bt_ctf_event_class_get_name(event
->event_class
),
329 bt_ctf_event_class_get_id(event
->event_class
));
335 ret
= bt_ctf_field_structure_set_field(event
->fields_payload
,
338 struct bt_ctf_field_type
*payload_type
;
340 payload_type
= bt_ctf_field_get_type(payload
);
342 if (bt_ctf_field_type_compare(payload_type
,
343 event
->event_class
->fields
) == 0) {
344 bt_put(event
->fields_payload
);
346 event
->fields_payload
= payload
;
348 BT_LOGW("Invalid parameter: payload field type is different from the expected field type: "
349 "event-addr=%p, event-class-name=\"%s\", "
350 "event-class-id=%" PRId64
,
352 bt_ctf_event_class_get_name(event
->event_class
),
353 bt_ctf_event_class_get_id(event
->event_class
));
357 bt_put(payload_type
);
361 BT_LOGW("Failed to set event's payload field: event-addr=%p, "
362 "event-class-name=\"%s\", event-class-id=%" PRId64
", "
363 "payload-field-name=\"%s\", payload-field-addr=%p",
364 event
, bt_ctf_event_class_get_name(event
->event_class
),
365 bt_ctf_event_class_get_id(event
->event_class
),
368 BT_LOGV("Set event's payload field: event-addr=%p, "
369 "event-class-name=\"%s\", event-class-id=%" PRId64
", "
370 "payload-field-name=\"%s\", payload-field-addr=%p",
371 event
, bt_ctf_event_class_get_name(event
->event_class
),
372 bt_ctf_event_class_get_id(event
->event_class
),
380 struct bt_ctf_field
*bt_ctf_event_get_event_payload(struct bt_ctf_event
*event
)
382 struct bt_ctf_field
*payload
= NULL
;
385 BT_LOGW_STR("Invalid parameter: event is NULL.");
389 if (!event
->fields_payload
) {
390 BT_LOGV("Event has no current payload field: addr=%p, "
391 "event-class-name=\"%s\", event-class-id=%" PRId64
,
392 event
, bt_ctf_event_class_get_name(event
->event_class
),
393 bt_ctf_event_class_get_id(event
->event_class
));
397 payload
= event
->fields_payload
;
403 int bt_ctf_event_set_event_payload(struct bt_ctf_event
*event
,
404 struct bt_ctf_field
*payload
)
406 return bt_ctf_event_set_payload(event
, NULL
, payload
);
409 struct bt_ctf_field
*bt_ctf_event_get_payload(struct bt_ctf_event
*event
,
412 struct bt_ctf_field
*field
= NULL
;
415 BT_LOGW_STR("Invalid parameter: event is NULL.");
420 field
= bt_ctf_field_structure_get_field(event
->fields_payload
,
423 field
= event
->fields_payload
;
430 struct bt_ctf_field
*bt_ctf_event_get_payload_by_index(
431 struct bt_ctf_event
*event
, uint64_t index
)
433 struct bt_ctf_field
*field
= NULL
;
436 BT_LOGW_STR("Invalid parameter: event is NULL.");
440 field
= bt_ctf_field_structure_get_field_by_index(event
->fields_payload
,
446 struct bt_ctf_field
*bt_ctf_event_get_header(
447 struct bt_ctf_event
*event
)
449 struct bt_ctf_field
*header
= NULL
;
452 BT_LOGW_STR("Invalid parameter: event is NULL.");
456 if (!event
->event_header
) {
457 BT_LOGV("Event has no current header field: addr=%p, "
458 "event-class-name=\"%s\", event-class-id=%" PRId64
,
459 event
, bt_ctf_event_class_get_name(event
->event_class
),
460 bt_ctf_event_class_get_id(event
->event_class
));
464 header
= event
->event_header
;
470 int bt_ctf_event_set_header(struct bt_ctf_event
*event
,
471 struct bt_ctf_field
*header
)
474 struct bt_ctf_field_type
*field_type
= NULL
;
475 struct bt_ctf_stream_class
*stream_class
= NULL
;
478 BT_LOGW_STR("Invalid parameter: event is NULL.");
484 BT_LOGW("Invalid parameter: event is frozen: addr=%p, "
485 "event-class-name=\"%s\", event-class-id=%" PRId64
,
486 event
, bt_ctf_event_class_get_name(event
->event_class
),
487 bt_ctf_event_class_get_id(event
->event_class
));
492 stream_class
= (struct bt_ctf_stream_class
*) bt_object_get_parent(
495 * Ensure the provided header's type matches the one registered to the
499 field_type
= bt_ctf_field_get_type(header
);
500 if (bt_ctf_field_type_compare(field_type
,
501 stream_class
->event_header_type
)) {
502 BT_LOGW("Invalid parameter: header field type is different from the expected field type: "
503 "event-addr=%p, event-class-name=\"%s\", "
504 "event-class-id=%" PRId64
,
506 bt_ctf_event_class_get_name(event
->event_class
),
507 bt_ctf_event_class_get_id(event
->event_class
));
512 if (stream_class
->event_header_type
) {
513 BT_LOGW("Invalid parameter: setting no event header but event header field type is not NULL: "
514 "event-addr=%p, event-class-name=\"%s\", "
515 "event-class-id=%" PRId64
", "
516 "event-header-ft-addr=%p",
518 bt_ctf_event_class_get_name(event
->event_class
),
519 bt_ctf_event_class_get_id(event
->event_class
),
520 stream_class
->event_header_type
);
526 bt_put(event
->event_header
);
527 event
->event_header
= bt_get(header
);
528 BT_LOGV("Set event's header field: event-addr=%p, "
529 "event-class-name=\"%s\", event-class-id=%" PRId64
", "
530 "header-field-addr=%p",
531 event
, bt_ctf_event_class_get_name(event
->event_class
),
532 bt_ctf_event_class_get_id(event
->event_class
), header
);
534 bt_put(stream_class
);
539 struct bt_ctf_field
*bt_ctf_event_get_event_context(
540 struct bt_ctf_event
*event
)
542 struct bt_ctf_field
*context
= NULL
;
545 BT_LOGW_STR("Invalid parameter: event is NULL.");
549 if (!event
->context_payload
) {
550 BT_LOGV("Event has no current context field: addr=%p, "
551 "event-class-name=\"%s\", event-class-id=%" PRId64
,
552 event
, bt_ctf_event_class_get_name(event
->event_class
),
553 bt_ctf_event_class_get_id(event
->event_class
));
557 context
= event
->context_payload
;
563 int bt_ctf_event_set_event_context(struct bt_ctf_event
*event
,
564 struct bt_ctf_field
*context
)
567 struct bt_ctf_field_type
*field_type
= NULL
;
570 BT_LOGW_STR("Invalid parameter: event is NULL.");
576 BT_LOGW("Invalid parameter: event is frozen: addr=%p, "
577 "event-class-name=\"%s\", event-class-id=%" PRId64
,
578 event
, bt_ctf_event_class_get_name(event
->event_class
),
579 bt_ctf_event_class_get_id(event
->event_class
));
585 field_type
= bt_ctf_field_get_type(context
);
587 if (bt_ctf_field_type_compare(field_type
,
588 event
->event_class
->context
)) {
589 BT_LOGW("Invalid parameter: context field type is different from the expected field type: "
590 "event-addr=%p, event-class-name=\"%s\", "
591 "event-class-id=%" PRId64
,
593 bt_ctf_event_class_get_name(event
->event_class
),
594 bt_ctf_event_class_get_id(event
->event_class
));
599 if (event
->event_class
->context
) {
600 BT_LOGW("Invalid parameter: setting no event context but event context field type is not NULL: "
601 "event-addr=%p, event-class-name=\"%s\", "
602 "event-class-id=%" PRId64
", "
603 "event-context-ft-addr=%p",
605 bt_ctf_event_class_get_name(event
->event_class
),
606 bt_ctf_event_class_get_id(event
->event_class
),
607 event
->event_class
->context
);
613 bt_put(event
->context_payload
);
614 event
->context_payload
= bt_get(context
);
615 BT_LOGV("Set event's context field: event-addr=%p, "
616 "event-class-name=\"%s\", event-class-id=%" PRId64
", "
617 "context-field-addr=%p",
618 event
, bt_ctf_event_class_get_name(event
->event_class
),
619 bt_ctf_event_class_get_id(event
->event_class
), context
);
625 struct bt_ctf_field
*bt_ctf_event_get_stream_event_context(
626 struct bt_ctf_event
*event
)
628 struct bt_ctf_field
*stream_event_context
= NULL
;
631 BT_LOGW_STR("Invalid parameter: event is NULL.");
635 if (!event
->stream_event_context
) {
636 BT_LOGV("Event has no current stream event context field: addr=%p, "
637 "event-class-name=\"%s\", event-class-id=%" PRId64
,
638 event
, bt_ctf_event_class_get_name(event
->event_class
),
639 bt_ctf_event_class_get_id(event
->event_class
));
643 stream_event_context
= event
->stream_event_context
;
645 return bt_get(stream_event_context
);
648 int bt_ctf_event_set_stream_event_context(struct bt_ctf_event
*event
,
649 struct bt_ctf_field
*stream_event_context
)
652 struct bt_ctf_field_type
*field_type
= NULL
;
653 struct bt_ctf_stream_class
*stream_class
= NULL
;
656 BT_LOGW_STR("Invalid parameter: event is NULL.");
662 BT_LOGW("Invalid parameter: event is frozen: addr=%p, "
663 "event-class-name=\"%s\", event-class-id=%" PRId64
,
664 event
, bt_ctf_event_class_get_name(event
->event_class
),
665 bt_ctf_event_class_get_id(event
->event_class
));
670 stream_class
= bt_ctf_event_class_get_stream_class(event
->event_class
);
672 * We should not have been able to create the event without associating
673 * the event class to a stream class.
675 assert(stream_class
);
677 if (stream_event_context
) {
678 field_type
= bt_ctf_field_get_type(stream_event_context
);
679 if (bt_ctf_field_type_compare(field_type
,
680 stream_class
->event_context_type
)) {
681 BT_LOGW("Invalid parameter: stream event context field type is different from the expected field type: "
682 "event-addr=%p, event-class-name=\"%s\", "
683 "event-class-id=%" PRId64
,
685 bt_ctf_event_class_get_name(event
->event_class
),
686 bt_ctf_event_class_get_id(event
->event_class
));
691 if (stream_class
->event_context_type
) {
692 BT_LOGW("Invalid parameter: setting no stream event context but stream event context field type is not NULL: "
693 "event-addr=%p, event-class-name=\"%s\", "
694 "event-class-id=%" PRId64
", "
695 "stream-event-context-ft-addr=%p",
697 bt_ctf_event_class_get_name(event
->event_class
),
698 bt_ctf_event_class_get_id(event
->event_class
),
699 stream_class
->event_context_type
);
705 bt_get(stream_event_context
);
706 BT_MOVE(event
->stream_event_context
, stream_event_context
);
707 BT_LOGV("Set event's stream event context field: event-addr=%p, "
708 "event-class-name=\"%s\", event-class-id=%" PRId64
", "
709 "stream-event-context-field-addr=%p",
710 event
, bt_ctf_event_class_get_name(event
->event_class
),
711 bt_ctf_event_class_get_id(event
->event_class
),
712 stream_event_context
);
714 BT_PUT(stream_class
);
719 /* Pre-2.0 CTF writer backward compatibility */
720 void bt_ctf_event_get(struct bt_ctf_event
*event
)
725 /* Pre-2.0 CTF writer backward compatibility */
726 void bt_ctf_event_put(struct bt_ctf_event
*event
)
731 void bt_ctf_event_destroy(struct bt_object
*obj
)
733 struct bt_ctf_event
*event
;
735 event
= container_of(obj
, struct bt_ctf_event
, base
);
736 BT_LOGD("Destroying event: addr=%p, "
737 "event-class-name=\"%s\", event-class-id=%" PRId64
,
738 event
, bt_ctf_event_class_get_name(event
->event_class
),
739 bt_ctf_event_class_get_id(event
->event_class
));
741 if (!event
->base
.parent
) {
743 * Event was keeping a reference to its class since it shared no
744 * common ancestor with it to guarantee they would both have the
747 bt_put(event
->event_class
);
749 g_hash_table_destroy(event
->clock_values
);
750 BT_LOGD_STR("Putting event's header field.");
751 bt_put(event
->event_header
);
752 BT_LOGD_STR("Putting event's stream event context field.");
753 bt_put(event
->stream_event_context
);
754 BT_LOGD_STR("Putting event's context field.");
755 bt_put(event
->context_payload
);
756 BT_LOGD_STR("Putting event's payload field.");
757 bt_put(event
->fields_payload
);
758 BT_LOGD_STR("Putting event's packet.");
759 bt_put(event
->packet
);
763 struct bt_ctf_clock_value
*bt_ctf_event_get_clock_value(
764 struct bt_ctf_event
*event
, struct bt_ctf_clock_class
*clock_class
)
766 struct bt_ctf_clock_value
*clock_value
= NULL
;
768 if (!event
|| !clock_class
) {
769 BT_LOGW("Invalid parameter: event or clock class is NULL: "
770 "event-addr=%p, clock-class-addr=%p",
775 clock_value
= g_hash_table_lookup(event
->clock_values
, clock_class
);
777 BT_LOGV("No clock value associated to the given clock class: "
778 "event-addr=%p, event-class-name=\"%s\", "
779 "event-class-id=%" PRId64
", clock-class-addr=%p, "
780 "clock-class-name=\"%s\"", event
,
781 bt_ctf_event_class_get_name(event
->event_class
),
782 bt_ctf_event_class_get_id(event
->event_class
),
783 clock_class
, bt_ctf_clock_class_get_name(clock_class
));
792 int bt_ctf_event_set_clock_value(struct bt_ctf_event
*event
,
793 struct bt_ctf_clock_value
*value
)
796 struct bt_ctf_trace
*trace
;
797 struct bt_ctf_stream_class
*stream_class
;
798 struct bt_ctf_event_class
*event_class
;
799 struct bt_ctf_clock_class
*clock_class
= NULL
;
801 if (!event
|| !value
) {
802 BT_LOGW("Invalid parameter: event or clock value is NULL: "
803 "event-addr=%p, clock-value-addr=%p",
810 BT_LOGW("Invalid parameter: event is frozen: addr=%p, "
811 "event-class-name=\"%s\", event-class-id=%" PRId64
,
812 event
, bt_ctf_event_class_get_name(event
->event_class
),
813 bt_ctf_event_class_get_id(event
->event_class
));
818 clock_class
= bt_ctf_clock_value_get_class(value
);
819 event_class
= bt_ctf_event_borrow_event_class(event
);
821 stream_class
= bt_ctf_event_class_borrow_stream_class(event_class
);
822 assert(stream_class
);
823 trace
= bt_ctf_stream_class_borrow_trace(stream_class
);
826 if (!bt_ctf_trace_has_clock_class(trace
, clock_class
)) {
827 BT_LOGW("Invalid parameter: clock class is not part of event's trace: "
828 "event-addr=%p, event-class-name=\"%s\", "
829 "event-class-id=%" PRId64
", clock-class-addr=%p, "
830 "clock-class-name=\"%s\"",
831 event
, bt_ctf_event_class_get_name(event
->event_class
),
832 bt_ctf_event_class_get_id(event
->event_class
),
833 clock_class
, bt_ctf_clock_class_get_name(clock_class
));
838 g_hash_table_insert(event
->clock_values
, clock_class
, bt_get(value
));
839 BT_LOGV("Set event's clock value: "
840 "event-addr=%p, event-class-name=\"%s\", "
841 "event-class-id=%" PRId64
", clock-class-addr=%p, "
842 "clock-class-name=\"%s\", clock-value-addr=%p, "
843 "clock-value-cycles=%" PRIu64
,
844 event
, bt_ctf_event_class_get_name(event
->event_class
),
845 bt_ctf_event_class_get_id(event
->event_class
),
846 clock_class
, bt_ctf_clock_class_get_name(clock_class
),
847 value
, value
->value
);
856 int bt_ctf_event_validate(struct bt_ctf_event
*event
)
858 /* Make sure each field's payload has been set */
860 struct bt_ctf_stream_class
*stream_class
= NULL
;
863 ret
= bt_ctf_field_validate(event
->event_header
);
865 BT_LOGD("Invalid event's header field: "
866 "event-addr=%p, event-class-name=\"%s\", "
867 "event-class-id=%" PRId64
,
868 event
, bt_ctf_event_class_get_name(event
->event_class
),
869 bt_ctf_event_class_get_id(event
->event_class
));
873 stream_class
= bt_ctf_event_class_get_stream_class(event
->event_class
);
875 * We should not have been able to create the event without associating
876 * the event class to a stream class.
878 assert(stream_class
);
879 if (stream_class
->event_context_type
) {
880 ret
= bt_ctf_field_validate(event
->stream_event_context
);
882 BT_LOGD("Invalid event's stream event context field: "
883 "event-addr=%p, event-class-name=\"%s\", "
884 "event-class-id=%" PRId64
,
886 bt_ctf_event_class_get_name(event
->event_class
),
887 bt_ctf_event_class_get_id(event
->event_class
));
892 ret
= bt_ctf_field_validate(event
->fields_payload
);
894 BT_LOGD("Invalid event's payload field: "
895 "event-addr=%p, event-class-name=\"%s\", "
896 "event-class-id=%" PRId64
,
898 bt_ctf_event_class_get_name(event
->event_class
),
899 bt_ctf_event_class_get_id(event
->event_class
));
903 if (event
->event_class
->context
) {
904 BT_LOGD("Invalid event's context field: "
905 "event-addr=%p, event-class-name=\"%s\", "
906 "event-class-id=%" PRId64
,
908 bt_ctf_event_class_get_name(event
->event_class
),
909 bt_ctf_event_class_get_id(event
->event_class
));
910 ret
= bt_ctf_field_validate(event
->context_payload
);
913 bt_put(stream_class
);
918 int bt_ctf_event_serialize(struct bt_ctf_event
*event
,
919 struct bt_ctf_stream_pos
*pos
,
920 enum bt_ctf_byte_order native_byte_order
)
927 BT_LOGV_STR("Serializing event's context field.");
928 if (event
->context_payload
) {
929 ret
= bt_ctf_field_serialize(event
->context_payload
, pos
,
932 BT_LOGW("Cannot serialize event's context field: "
933 "event-addr=%p, event-class-name=\"%s\", "
934 "event-class-id=%" PRId64
,
936 bt_ctf_event_class_get_name(event
->event_class
),
937 bt_ctf_event_class_get_id(event
->event_class
));
942 BT_LOGV_STR("Serializing event's payload field.");
943 if (event
->fields_payload
) {
944 ret
= bt_ctf_field_serialize(event
->fields_payload
, pos
,
947 BT_LOGW("Cannot serialize event's payload field: "
948 "event-addr=%p, event-class-name=\"%s\", "
949 "event-class-id=%" PRId64
,
951 bt_ctf_event_class_get_name(event
->event_class
),
952 bt_ctf_event_class_get_id(event
->event_class
));
960 struct bt_ctf_packet
*bt_ctf_event_get_packet(struct bt_ctf_event
*event
)
962 struct bt_ctf_packet
*packet
= NULL
;
965 BT_LOGW_STR("Invalid parameter: event is NULL.");
969 if (!event
->packet
) {
970 BT_LOGV("Event has no current packet: addr=%p, "
971 "event-class-name=\"%s\", event-class-id=%" PRId64
,
972 event
, bt_ctf_event_class_get_name(event
->event_class
),
973 bt_ctf_event_class_get_id(event
->event_class
));
977 packet
= bt_get(event
->packet
);
982 int bt_ctf_event_set_packet(struct bt_ctf_event
*event
,
983 struct bt_ctf_packet
*packet
)
985 struct bt_ctf_stream_class
*event_stream_class
= NULL
;
986 struct bt_ctf_stream_class
*packet_stream_class
= NULL
;
987 struct bt_ctf_stream
*stream
= NULL
;
990 if (!event
|| !packet
) {
991 BT_LOGW("Invalid parameter: event or packet is NULL: "
992 "event-addr=%p, packet-addr=%p",
999 BT_LOGW("Invalid parameter: event is frozen: addr=%p, "
1000 "event-class-name=\"%s\", event-class-id=%" PRId64
,
1001 event
, bt_ctf_event_class_get_name(event
->event_class
),
1002 bt_ctf_event_class_get_id(event
->event_class
));
1008 * Make sure the new packet was created by this event's
1009 * stream, if it is set.
1011 stream
= bt_ctf_event_get_stream(event
);
1013 if (packet
->stream
!= stream
) {
1014 BT_LOGW("Invalid parameter: packet's stream and event's stream differ: "
1015 "event-addr=%p, event-class-name=\"%s\", "
1016 "event-class-id=%" PRId64
", packet-stream-addr=%p, "
1017 "event-stream-addr=%p",
1018 event
, bt_ctf_event_class_get_name(event
->event_class
),
1019 bt_ctf_event_class_get_id(event
->event_class
),
1020 packet
->stream
, stream
);
1025 event_stream_class
=
1026 bt_ctf_event_class_get_stream_class(event
->event_class
);
1027 packet_stream_class
=
1028 bt_ctf_stream_get_class(packet
->stream
);
1030 assert(event_stream_class
);
1031 assert(packet_stream_class
);
1033 if (event_stream_class
!= packet_stream_class
) {
1034 BT_LOGW("Invalid parameter: packet's stream class and event's stream class differ: "
1035 "event-addr=%p, event-class-name=\"%s\", "
1036 "event-class-id=%" PRId64
", packet-stream-class-addr=%p, "
1037 "event-stream-class-addr=%p",
1038 event
, bt_ctf_event_class_get_name(event
->event_class
),
1039 bt_ctf_event_class_get_id(event
->event_class
),
1040 packet_stream_class
, event_stream_class
);
1047 BT_MOVE(event
->packet
, packet
);
1048 BT_LOGV("Set event's packet: event-addr=%p, "
1049 "event-class-name=\"%s\", event-class-id=%" PRId64
", "
1051 event
, bt_ctf_event_class_get_name(event
->event_class
),
1052 bt_ctf_event_class_get_id(event
->event_class
), packet
);
1056 BT_PUT(event_stream_class
);
1057 BT_PUT(packet_stream_class
);
1063 void bt_ctf_event_freeze(struct bt_ctf_event
*event
)
1067 if (event
->frozen
) {
1071 BT_LOGD("Freezing event: addr=%p, "
1072 "event-class-name=\"%s\", event-class-id=%" PRId64
,
1073 event
, bt_ctf_event_class_get_name(event
->event_class
),
1074 bt_ctf_event_class_get_id(event
->event_class
));
1075 bt_ctf_packet_freeze(event
->packet
);
1076 BT_LOGD_STR("Freezing event's header field.");
1077 bt_ctf_field_freeze(event
->event_header
);
1078 BT_LOGD_STR("Freezing event's stream event context field.");
1079 bt_ctf_field_freeze(event
->stream_event_context
);
1080 BT_LOGD_STR("Freezing event's context field.");
1081 bt_ctf_field_freeze(event
->context_payload
);
1082 BT_LOGD_STR("Freezing event's payload field.");
1083 bt_ctf_field_freeze(event
->fields_payload
);