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-value.h>
36 #include <babeltrace/ctf-ir/clock-value-internal.h>
37 #include <babeltrace/ctf-ir/clock-class-internal.h>
38 #include <babeltrace/ctf-ir/event-internal.h>
39 #include <babeltrace/ctf-ir/event-class.h>
40 #include <babeltrace/ctf-ir/event-class-internal.h>
41 #include <babeltrace/ctf-ir/stream-class.h>
42 #include <babeltrace/ctf-ir/stream-class-internal.h>
43 #include <babeltrace/ctf-ir/stream-internal.h>
44 #include <babeltrace/ctf-ir/packet.h>
45 #include <babeltrace/ctf-ir/packet-internal.h>
46 #include <babeltrace/ctf-ir/trace-internal.h>
47 #include <babeltrace/ctf-ir/validation-internal.h>
48 #include <babeltrace/ctf-ir/packet-internal.h>
49 #include <babeltrace/ctf-ir/utils.h>
50 #include <babeltrace/ctf-writer/serialize-internal.h>
51 #include <babeltrace/ref.h>
52 #include <babeltrace/ctf-ir/attributes-internal.h>
53 #include <babeltrace/compiler-internal.h>
57 void bt_event_destroy(struct bt_object
*obj
);
59 struct bt_event
*bt_event_create(struct bt_event_class
*event_class
)
62 enum bt_validation_flag validation_flags
=
63 BT_VALIDATION_FLAG_STREAM
|
64 BT_VALIDATION_FLAG_EVENT
;
65 struct bt_event
*event
= NULL
;
66 struct bt_trace
*trace
= NULL
;
67 struct bt_stream_class
*stream_class
= NULL
;
68 struct bt_field_type
*packet_header_type
= NULL
;
69 struct bt_field_type
*packet_context_type
= NULL
;
70 struct bt_field_type
*event_header_type
= NULL
;
71 struct bt_field_type
*stream_event_ctx_type
= NULL
;
72 struct bt_field_type
*event_context_type
= NULL
;
73 struct bt_field_type
*event_payload_type
= NULL
;
74 struct bt_field
*event_header
= NULL
;
75 struct bt_field
*stream_event_context
= NULL
;
76 struct bt_field
*event_context
= NULL
;
77 struct bt_field
*event_payload
= NULL
;
78 struct bt_value
*environment
= NULL
;
79 struct bt_validation_output validation_output
= { 0 };
82 BT_LOGD("Creating event object: event-class-addr=%p, "
83 "event-class-name=\"%s\", event-class-id=%" PRId64
,
84 event_class
, bt_event_class_get_name(event_class
),
85 bt_event_class_get_id(event_class
));
88 BT_LOGW_STR("Invalid parameter: event class is NULL.");
92 stream_class
= bt_event_class_get_stream_class(event_class
);
95 * We disallow the creation of an event if its event class has not been
96 * associated to a stream class.
99 BT_LOGW_STR("Event class is not part of a stream class.");
103 /* The event class was frozen when added to its stream class */
104 assert(event_class
->frozen
);
106 /* Validate the trace (if any), the stream class, and the event class */
107 trace
= bt_stream_class_get_trace(stream_class
);
109 BT_LOGD_STR("Event's class is part of a trace.");
110 packet_header_type
= bt_trace_get_packet_header_type(trace
);
111 trace_valid
= trace
->valid
;
113 environment
= trace
->environment
;
116 packet_context_type
= bt_stream_class_get_packet_context_type(
118 event_header_type
= bt_stream_class_get_event_header_type(
120 stream_event_ctx_type
= bt_stream_class_get_event_context_type(
122 event_context_type
= bt_event_class_get_context_type(event_class
);
123 event_payload_type
= bt_event_class_get_payload_type(event_class
);
124 ret
= bt_validate_class_types(environment
, packet_header_type
,
125 packet_context_type
, event_header_type
, stream_event_ctx_type
,
126 event_context_type
, event_payload_type
, trace_valid
,
127 stream_class
->valid
, event_class
->valid
,
128 &validation_output
, validation_flags
);
129 BT_PUT(packet_header_type
);
130 BT_PUT(packet_context_type
);
131 BT_PUT(event_header_type
);
132 BT_PUT(stream_event_ctx_type
);
133 BT_PUT(event_context_type
);
134 BT_PUT(event_payload_type
);
137 * This means something went wrong during the validation
138 * process, not that the objects are invalid.
140 BT_LOGE("Failed to validate event and parents: ret=%d", ret
);
144 if ((validation_output
.valid_flags
& validation_flags
) !=
146 /* Invalid trace/stream class/event class */
147 BT_LOGW("Invalid trace, stream class, or event class: "
148 "valid-flags=0x%x", validation_output
.valid_flags
);
153 * At this point we know the trace (if associated to the stream
154 * class), the stream class, and the event class, with their
155 * current types, are valid. We may proceed with creating
158 event
= g_new0(struct bt_event
, 1);
160 BT_LOGE_STR("Failed to allocate one event.");
164 bt_object_init(event
, bt_event_destroy
);
167 * event does not share a common ancestor with the event class; it has
168 * to guarantee its existence by holding a reference. This reference
169 * shall be released once the event is associated to a stream since,
170 * from that point, the event and its class will share the same
173 event
->event_class
= bt_get(event_class
);
174 event
->clock_values
= g_hash_table_new_full(g_direct_hash
,
175 g_direct_equal
, bt_put
, bt_put
);
177 if (validation_output
.event_header_type
) {
178 BT_LOGD("Creating initial event header field: ft-addr=%p",
179 validation_output
.event_header_type
);
181 bt_field_create(validation_output
.event_header_type
);
183 BT_LOGE_STR("Cannot create initial event header field object.");
188 if (validation_output
.stream_event_ctx_type
) {
189 BT_LOGD("Creating initial stream event context field: ft-addr=%p",
190 validation_output
.stream_event_ctx_type
);
191 stream_event_context
= bt_field_create(
192 validation_output
.stream_event_ctx_type
);
193 if (!stream_event_context
) {
194 BT_LOGE_STR("Cannot create initial stream event context field object.");
199 if (validation_output
.event_context_type
) {
200 BT_LOGD("Creating initial event context field: ft-addr=%p",
201 validation_output
.event_context_type
);
202 event_context
= bt_field_create(
203 validation_output
.event_context_type
);
204 if (!event_context
) {
205 BT_LOGE_STR("Cannot create initial event context field object.");
210 if (validation_output
.event_payload_type
) {
211 BT_LOGD("Creating initial event payload field: ft-addr=%p",
212 validation_output
.event_payload_type
);
213 event_payload
= bt_field_create(
214 validation_output
.event_payload_type
);
215 if (!event_payload
) {
216 BT_LOGE_STR("Cannot create initial event payload field object.");
222 * At this point all the fields are created, potentially from
223 * validated copies of field types, so that the field types and
224 * fields can be replaced in the trace, stream class,
225 * event class, and created event.
227 bt_validation_replace_types(trace
, stream_class
,
228 event_class
, &validation_output
, validation_flags
);
229 BT_MOVE(event
->event_header
, event_header
);
230 BT_MOVE(event
->stream_event_context
, stream_event_context
);
231 BT_MOVE(event
->context_payload
, event_context
);
232 BT_MOVE(event
->fields_payload
, event_payload
);
235 * Put what was not moved in bt_validation_replace_types().
237 bt_validation_output_put_types(&validation_output
);
240 * Freeze the stream class since the event header must not be changed
243 bt_stream_class_freeze(stream_class
);
246 * Mark stream class, and event class as valid since
247 * they're all frozen now.
249 stream_class
->valid
= 1;
250 event_class
->valid
= 1;
252 /* Put stuff we borrowed from the event class */
253 BT_PUT(stream_class
);
255 BT_LOGD("Created event object: addr=%p, event-class-name=\"%s\", "
256 "event-class-id=%" PRId64
,
257 event
, bt_event_class_get_name(event
->event_class
),
258 bt_event_class_get_id(event_class
));
262 bt_validation_output_put_types(&validation_output
);
264 BT_PUT(stream_class
);
266 BT_PUT(event_header
);
267 BT_PUT(stream_event_context
);
268 BT_PUT(event_context
);
269 BT_PUT(event_payload
);
270 assert(!packet_header_type
);
271 assert(!packet_context_type
);
272 assert(!event_header_type
);
273 assert(!stream_event_ctx_type
);
274 assert(!event_context_type
);
275 assert(!event_payload_type
);
280 struct bt_event_class
*bt_event_get_class(struct bt_event
*event
)
282 struct bt_event_class
*event_class
= NULL
;
285 BT_LOGW_STR("Invalid parameter: event is NULL.");
289 event_class
= bt_get(bt_event_borrow_event_class(event
));
294 struct bt_stream
*bt_event_get_stream(struct bt_event
*event
)
296 struct bt_stream
*stream
= NULL
;
299 BT_LOGW_STR("Invalid parameter: event is NULL.");
304 * If the event has a parent, then this is its (writer) stream.
305 * If the event has no parent, then if it has a packet, this
306 * is its (non-writer) stream.
308 if (event
->base
.parent
) {
309 stream
= (struct bt_stream
*) bt_object_get_parent(event
);
312 stream
= bt_get(event
->packet
->stream
);
320 int bt_event_set_payload(struct bt_event
*event
,
322 struct bt_field
*payload
)
326 if (!event
|| !payload
) {
327 BT_LOGW("Invalid parameter: event or payload field is NULL: "
328 "event-addr=%p, payload-field-addr=%p",
335 BT_LOGW("Invalid parameter: event is frozen: addr=%p, "
336 "event-class-name=\"%s\", event-class-id=%" PRId64
,
337 event
, bt_event_class_get_name(event
->event_class
),
338 bt_event_class_get_id(event
->event_class
));
344 ret
= bt_field_structure_set_field_by_name(
345 event
->fields_payload
, name
, payload
);
347 struct bt_field_type
*payload_type
;
349 payload_type
= bt_field_get_type(payload
);
351 if (bt_field_type_compare(payload_type
,
352 event
->event_class
->fields
) == 0) {
353 bt_put(event
->fields_payload
);
355 event
->fields_payload
= payload
;
357 BT_LOGW("Invalid parameter: payload field type is different from the expected field type: "
358 "event-addr=%p, event-class-name=\"%s\", "
359 "event-class-id=%" PRId64
,
361 bt_event_class_get_name(event
->event_class
),
362 bt_event_class_get_id(event
->event_class
));
366 bt_put(payload_type
);
370 BT_LOGW("Failed to set event's payload field: event-addr=%p, "
371 "event-class-name=\"%s\", event-class-id=%" PRId64
", "
372 "payload-field-name=\"%s\", payload-field-addr=%p",
373 event
, bt_event_class_get_name(event
->event_class
),
374 bt_event_class_get_id(event
->event_class
),
377 BT_LOGV("Set event's payload field: event-addr=%p, "
378 "event-class-name=\"%s\", event-class-id=%" PRId64
", "
379 "payload-field-name=\"%s\", payload-field-addr=%p",
380 event
, bt_event_class_get_name(event
->event_class
),
381 bt_event_class_get_id(event
->event_class
),
389 struct bt_field
*bt_event_get_event_payload(struct bt_event
*event
)
391 struct bt_field
*payload
= NULL
;
394 BT_LOGW_STR("Invalid parameter: event is NULL.");
398 if (!event
->fields_payload
) {
399 BT_LOGV("Event has no current payload field: addr=%p, "
400 "event-class-name=\"%s\", event-class-id=%" PRId64
,
401 event
, bt_event_class_get_name(event
->event_class
),
402 bt_event_class_get_id(event
->event_class
));
406 payload
= event
->fields_payload
;
412 int bt_event_set_event_payload(struct bt_event
*event
,
413 struct bt_field
*payload
)
415 return bt_event_set_payload(event
, NULL
, payload
);
418 struct bt_field
*bt_event_get_payload(struct bt_event
*event
,
421 struct bt_field
*field
= NULL
;
424 BT_LOGW_STR("Invalid parameter: event is NULL.");
429 field
= bt_field_structure_get_field_by_name(
430 event
->fields_payload
, name
);
432 field
= event
->fields_payload
;
439 struct bt_field
*bt_event_get_payload_by_index(
440 struct bt_event
*event
, uint64_t index
)
442 struct bt_field
*field
= NULL
;
445 BT_LOGW_STR("Invalid parameter: event is NULL.");
449 field
= bt_field_structure_get_field_by_index(event
->fields_payload
,
455 struct bt_field
*bt_event_get_header(
456 struct bt_event
*event
)
458 struct bt_field
*header
= NULL
;
461 BT_LOGW_STR("Invalid parameter: event is NULL.");
465 if (!event
->event_header
) {
466 BT_LOGV("Event has no current header field: addr=%p, "
467 "event-class-name=\"%s\", event-class-id=%" PRId64
,
468 event
, bt_event_class_get_name(event
->event_class
),
469 bt_event_class_get_id(event
->event_class
));
473 header
= event
->event_header
;
479 int bt_event_set_header(struct bt_event
*event
,
480 struct bt_field
*header
)
483 struct bt_field_type
*field_type
= NULL
;
484 struct bt_stream_class
*stream_class
= NULL
;
487 BT_LOGW_STR("Invalid parameter: event is NULL.");
493 BT_LOGW("Invalid parameter: event is frozen: addr=%p, "
494 "event-class-name=\"%s\", event-class-id=%" PRId64
,
495 event
, bt_event_class_get_name(event
->event_class
),
496 bt_event_class_get_id(event
->event_class
));
501 stream_class
= (struct bt_stream_class
*) bt_object_get_parent(
504 * Ensure the provided header's type matches the one registered to the
508 field_type
= bt_field_get_type(header
);
509 if (bt_field_type_compare(field_type
,
510 stream_class
->event_header_type
)) {
511 BT_LOGW("Invalid parameter: header field type is different from the expected field type: "
512 "event-addr=%p, event-class-name=\"%s\", "
513 "event-class-id=%" PRId64
,
515 bt_event_class_get_name(event
->event_class
),
516 bt_event_class_get_id(event
->event_class
));
521 if (stream_class
->event_header_type
) {
522 BT_LOGW("Invalid parameter: setting no event header but event header field type is not NULL: "
523 "event-addr=%p, event-class-name=\"%s\", "
524 "event-class-id=%" PRId64
", "
525 "event-header-ft-addr=%p",
527 bt_event_class_get_name(event
->event_class
),
528 bt_event_class_get_id(event
->event_class
),
529 stream_class
->event_header_type
);
535 bt_put(event
->event_header
);
536 event
->event_header
= bt_get(header
);
537 BT_LOGV("Set event's header field: event-addr=%p, "
538 "event-class-name=\"%s\", event-class-id=%" PRId64
", "
539 "header-field-addr=%p",
540 event
, bt_event_class_get_name(event
->event_class
),
541 bt_event_class_get_id(event
->event_class
), header
);
543 bt_put(stream_class
);
548 struct bt_field
*bt_event_get_event_context(
549 struct bt_event
*event
)
551 struct bt_field
*context
= NULL
;
554 BT_LOGW_STR("Invalid parameter: event is NULL.");
558 if (!event
->context_payload
) {
559 BT_LOGV("Event has no current context field: addr=%p, "
560 "event-class-name=\"%s\", event-class-id=%" PRId64
,
561 event
, bt_event_class_get_name(event
->event_class
),
562 bt_event_class_get_id(event
->event_class
));
566 context
= event
->context_payload
;
572 int bt_event_set_event_context(struct bt_event
*event
,
573 struct bt_field
*context
)
576 struct bt_field_type
*field_type
= NULL
;
579 BT_LOGW_STR("Invalid parameter: event is NULL.");
585 BT_LOGW("Invalid parameter: event is frozen: addr=%p, "
586 "event-class-name=\"%s\", event-class-id=%" PRId64
,
587 event
, bt_event_class_get_name(event
->event_class
),
588 bt_event_class_get_id(event
->event_class
));
594 field_type
= bt_field_get_type(context
);
596 if (bt_field_type_compare(field_type
,
597 event
->event_class
->context
)) {
598 BT_LOGW("Invalid parameter: context field type is different from the expected field type: "
599 "event-addr=%p, event-class-name=\"%s\", "
600 "event-class-id=%" PRId64
,
602 bt_event_class_get_name(event
->event_class
),
603 bt_event_class_get_id(event
->event_class
));
608 if (event
->event_class
->context
) {
609 BT_LOGW("Invalid parameter: setting no event context but event context field type is not NULL: "
610 "event-addr=%p, event-class-name=\"%s\", "
611 "event-class-id=%" PRId64
", "
612 "event-context-ft-addr=%p",
614 bt_event_class_get_name(event
->event_class
),
615 bt_event_class_get_id(event
->event_class
),
616 event
->event_class
->context
);
622 bt_put(event
->context_payload
);
623 event
->context_payload
= bt_get(context
);
624 BT_LOGV("Set event's context field: event-addr=%p, "
625 "event-class-name=\"%s\", event-class-id=%" PRId64
", "
626 "context-field-addr=%p",
627 event
, bt_event_class_get_name(event
->event_class
),
628 bt_event_class_get_id(event
->event_class
), context
);
634 struct bt_field
*bt_event_get_stream_event_context(
635 struct bt_event
*event
)
637 struct bt_field
*stream_event_context
= NULL
;
640 BT_LOGW_STR("Invalid parameter: event is NULL.");
644 if (!event
->stream_event_context
) {
645 BT_LOGV("Event has no current stream event context field: addr=%p, "
646 "event-class-name=\"%s\", event-class-id=%" PRId64
,
647 event
, bt_event_class_get_name(event
->event_class
),
648 bt_event_class_get_id(event
->event_class
));
652 stream_event_context
= event
->stream_event_context
;
654 return bt_get(stream_event_context
);
657 int bt_event_set_stream_event_context(struct bt_event
*event
,
658 struct bt_field
*stream_event_context
)
661 struct bt_field_type
*field_type
= NULL
;
662 struct bt_stream_class
*stream_class
= NULL
;
665 BT_LOGW_STR("Invalid parameter: event is NULL.");
671 BT_LOGW("Invalid parameter: event is frozen: addr=%p, "
672 "event-class-name=\"%s\", event-class-id=%" PRId64
,
673 event
, bt_event_class_get_name(event
->event_class
),
674 bt_event_class_get_id(event
->event_class
));
679 stream_class
= bt_event_class_get_stream_class(event
->event_class
);
681 * We should not have been able to create the event without associating
682 * the event class to a stream class.
684 assert(stream_class
);
686 if (stream_event_context
) {
687 field_type
= bt_field_get_type(stream_event_context
);
688 if (bt_field_type_compare(field_type
,
689 stream_class
->event_context_type
)) {
690 BT_LOGW("Invalid parameter: stream event context field type is different from the expected field type: "
691 "event-addr=%p, event-class-name=\"%s\", "
692 "event-class-id=%" PRId64
,
694 bt_event_class_get_name(event
->event_class
),
695 bt_event_class_get_id(event
->event_class
));
700 if (stream_class
->event_context_type
) {
701 BT_LOGW("Invalid parameter: setting no stream event context but stream event context field type is not NULL: "
702 "event-addr=%p, event-class-name=\"%s\", "
703 "event-class-id=%" PRId64
", "
704 "stream-event-context-ft-addr=%p",
706 bt_event_class_get_name(event
->event_class
),
707 bt_event_class_get_id(event
->event_class
),
708 stream_class
->event_context_type
);
714 bt_get(stream_event_context
);
715 BT_MOVE(event
->stream_event_context
, stream_event_context
);
716 BT_LOGV("Set event's stream event context field: event-addr=%p, "
717 "event-class-name=\"%s\", event-class-id=%" PRId64
", "
718 "stream-event-context-field-addr=%p",
719 event
, bt_event_class_get_name(event
->event_class
),
720 bt_event_class_get_id(event
->event_class
),
721 stream_event_context
);
723 BT_PUT(stream_class
);
728 /* Pre-2.0 CTF writer backward compatibility */
729 void bt_ctf_event_get(struct bt_event
*event
)
734 /* Pre-2.0 CTF writer backward compatibility */
735 void bt_ctf_event_put(struct bt_event
*event
)
740 void bt_event_destroy(struct bt_object
*obj
)
742 struct bt_event
*event
;
744 event
= container_of(obj
, struct bt_event
, base
);
745 BT_LOGD("Destroying event: addr=%p, "
746 "event-class-name=\"%s\", event-class-id=%" PRId64
,
747 event
, bt_event_class_get_name(event
->event_class
),
748 bt_event_class_get_id(event
->event_class
));
750 if (!event
->base
.parent
) {
752 * Event was keeping a reference to its class since it shared no
753 * common ancestor with it to guarantee they would both have the
756 bt_put(event
->event_class
);
758 g_hash_table_destroy(event
->clock_values
);
759 BT_LOGD_STR("Putting event's header field.");
760 bt_put(event
->event_header
);
761 BT_LOGD_STR("Putting event's stream event context field.");
762 bt_put(event
->stream_event_context
);
763 BT_LOGD_STR("Putting event's context field.");
764 bt_put(event
->context_payload
);
765 BT_LOGD_STR("Putting event's payload field.");
766 bt_put(event
->fields_payload
);
767 BT_LOGD_STR("Putting event's packet.");
768 bt_put(event
->packet
);
772 struct bt_clock_value
*bt_event_get_clock_value(
773 struct bt_event
*event
, struct bt_clock_class
*clock_class
)
775 struct bt_clock_value
*clock_value
= NULL
;
777 if (!event
|| !clock_class
) {
778 BT_LOGW("Invalid parameter: event or clock class is NULL: "
779 "event-addr=%p, clock-class-addr=%p",
784 clock_value
= g_hash_table_lookup(event
->clock_values
, clock_class
);
786 BT_LOGV("No clock value associated to the given clock class: "
787 "event-addr=%p, event-class-name=\"%s\", "
788 "event-class-id=%" PRId64
", clock-class-addr=%p, "
789 "clock-class-name=\"%s\"", event
,
790 bt_event_class_get_name(event
->event_class
),
791 bt_event_class_get_id(event
->event_class
),
792 clock_class
, bt_clock_class_get_name(clock_class
));
801 int bt_event_set_clock_value(struct bt_event
*event
,
802 struct bt_clock_value
*value
)
805 struct bt_trace
*trace
;
806 struct bt_stream_class
*stream_class
;
807 struct bt_event_class
*event_class
;
808 struct bt_clock_class
*clock_class
= NULL
;
810 if (!event
|| !value
) {
811 BT_LOGW("Invalid parameter: event or clock value is NULL: "
812 "event-addr=%p, clock-value-addr=%p",
819 BT_LOGW("Invalid parameter: event is frozen: addr=%p, "
820 "event-class-name=\"%s\", event-class-id=%" PRId64
,
821 event
, bt_event_class_get_name(event
->event_class
),
822 bt_event_class_get_id(event
->event_class
));
827 clock_class
= bt_clock_value_get_class(value
);
828 event_class
= bt_event_borrow_event_class(event
);
830 stream_class
= bt_event_class_borrow_stream_class(event_class
);
831 assert(stream_class
);
832 trace
= bt_stream_class_borrow_trace(stream_class
);
835 if (!bt_trace_has_clock_class(trace
, clock_class
)) {
836 BT_LOGW("Invalid parameter: clock class is not part of event's trace: "
837 "event-addr=%p, event-class-name=\"%s\", "
838 "event-class-id=%" PRId64
", clock-class-addr=%p, "
839 "clock-class-name=\"%s\"",
840 event
, bt_event_class_get_name(event
->event_class
),
841 bt_event_class_get_id(event
->event_class
),
842 clock_class
, bt_clock_class_get_name(clock_class
));
847 g_hash_table_insert(event
->clock_values
, clock_class
, bt_get(value
));
848 BT_LOGV("Set event's clock value: "
849 "event-addr=%p, event-class-name=\"%s\", "
850 "event-class-id=%" PRId64
", clock-class-addr=%p, "
851 "clock-class-name=\"%s\", clock-value-addr=%p, "
852 "clock-value-cycles=%" PRIu64
,
853 event
, bt_event_class_get_name(event
->event_class
),
854 bt_event_class_get_id(event
->event_class
),
855 clock_class
, bt_clock_class_get_name(clock_class
),
856 value
, value
->value
);
865 int bt_event_validate(struct bt_event
*event
)
867 /* Make sure each field's payload has been set */
869 struct bt_stream_class
*stream_class
= NULL
;
872 if (event
->event_header
) {
873 ret
= bt_field_validate(event
->event_header
);
875 BT_LOGD("Invalid event's header field: "
876 "event-addr=%p, event-class-name=\"%s\", "
877 "event-class-id=%" PRId64
,
878 event
, bt_event_class_get_name(event
->event_class
),
879 bt_event_class_get_id(event
->event_class
));
884 stream_class
= bt_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_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_event_class_get_name(event
->event_class
),
898 bt_event_class_get_id(event
->event_class
));
903 ret
= bt_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_event_class_get_name(event
->event_class
),
910 bt_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_event_class_get_name(event
->event_class
),
920 bt_event_class_get_id(event
->event_class
));
921 ret
= bt_field_validate(event
->context_payload
);
924 bt_put(stream_class
);
929 int bt_event_serialize(struct bt_event
*event
,
930 struct bt_stream_pos
*pos
,
931 enum bt_byte_order native_byte_order
)
938 BT_LOGV_STR("Serializing event's context field.");
939 if (event
->context_payload
) {
940 ret
= bt_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_event_class_get_name(event
->event_class
),
948 bt_event_class_get_id(event
->event_class
));
953 BT_LOGV_STR("Serializing event's payload field.");
954 if (event
->fields_payload
) {
955 ret
= bt_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_event_class_get_name(event
->event_class
),
963 bt_event_class_get_id(event
->event_class
));
971 struct bt_packet
*bt_event_get_packet(struct bt_event
*event
)
973 struct bt_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_event_class_get_name(event
->event_class
),
984 bt_event_class_get_id(event
->event_class
));
988 packet
= bt_get(event
->packet
);
993 int bt_event_set_packet(struct bt_event
*event
,
994 struct bt_packet
*packet
)
996 struct bt_stream_class
*event_stream_class
= NULL
;
997 struct bt_stream_class
*packet_stream_class
= NULL
;
998 struct bt_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_event_class_get_name(event
->event_class
),
1013 bt_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_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_event_class_get_name(event
->event_class
),
1030 bt_event_class_get_id(event
->event_class
),
1031 packet
->stream
, stream
);
1036 event_stream_class
=
1037 bt_event_class_get_stream_class(event
->event_class
);
1038 packet_stream_class
=
1039 bt_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_event_class_get_name(event
->event_class
),
1050 bt_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_event_class_get_name(event
->event_class
),
1063 bt_event_class_get_id(event
->event_class
), packet
);
1067 BT_PUT(event_stream_class
);
1068 BT_PUT(packet_stream_class
);
1074 void bt_event_freeze(struct bt_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_event_class_get_name(event
->event_class
),
1085 bt_event_class_get_id(event
->event_class
));
1086 bt_packet_freeze(event
->packet
);
1087 BT_LOGD_STR("Freezing event's header field.");
1088 bt_field_freeze(event
->event_header
);
1089 BT_LOGD_STR("Freezing event's stream event context field.");
1090 bt_field_freeze(event
->stream_event_context
);
1091 BT_LOGD_STR("Freezing event's context field.");
1092 bt_field_freeze(event
->context_payload
);
1093 BT_LOGD_STR("Freezing event's payload field.");
1094 bt_field_freeze(event
->fields_payload
);