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/ctf-writer/clock-internal.h>
52 #include <babeltrace/ref.h>
53 #include <babeltrace/ctf-ir/attributes-internal.h>
54 #include <babeltrace/compiler-internal.h>
58 void bt_event_destroy(struct bt_object
*obj
);
60 struct bt_event
*bt_event_create(struct bt_event_class
*event_class
)
63 enum bt_validation_flag validation_flags
=
64 BT_VALIDATION_FLAG_STREAM
|
65 BT_VALIDATION_FLAG_EVENT
;
66 struct bt_event
*event
= NULL
;
67 struct bt_trace
*trace
= NULL
;
68 struct bt_stream_class
*stream_class
= NULL
;
69 struct bt_field_type
*packet_header_type
= NULL
;
70 struct bt_field_type
*packet_context_type
= NULL
;
71 struct bt_field_type
*event_header_type
= NULL
;
72 struct bt_field_type
*stream_event_ctx_type
= NULL
;
73 struct bt_field_type
*event_context_type
= NULL
;
74 struct bt_field_type
*event_payload_type
= NULL
;
75 struct bt_field
*event_header
= NULL
;
76 struct bt_field
*stream_event_context
= NULL
;
77 struct bt_field
*event_context
= NULL
;
78 struct bt_field
*event_payload
= NULL
;
79 struct bt_value
*environment
= NULL
;
80 struct bt_validation_output validation_output
= { 0 };
82 struct bt_clock_class
*expected_clock_class
= NULL
;
84 BT_LOGD("Creating event object: event-class-addr=%p, "
85 "event-class-name=\"%s\", event-class-id=%" PRId64
,
86 event_class
, bt_event_class_get_name(event_class
),
87 bt_event_class_get_id(event_class
));
90 BT_LOGW_STR("Invalid parameter: event class is NULL.");
94 stream_class
= bt_event_class_get_stream_class(event_class
);
97 * We disallow the creation of an event if its event class has not been
98 * associated to a stream class.
101 BT_LOGW_STR("Event class is not part of a stream class.");
105 /* The event class was frozen when added to its stream class */
106 assert(event_class
->frozen
);
108 if (!stream_class
->frozen
) {
109 if (stream_class
->clock
) {
110 expected_clock_class
=
111 bt_get(stream_class
->clock
->clock_class
);
115 * Because this function freezes the stream class,
116 * validate that this stream class contains at most a
117 * single clock class so that we set its expected clock
118 * class for future checks.
120 ret
= bt_stream_class_validate_single_clock_class(
121 stream_class
, &expected_clock_class
);
123 BT_LOGW("Event class's stream class or one of its event "
124 "classes contains a field type which is not "
125 "recursively mapped to the expected "
127 "stream-class-addr=%p, "
128 "stream-class-id=%" PRId64
", "
129 "stream-class-name=\"%s\", "
130 "expected-clock-class-addr=%p, "
131 "expected-clock-class-name=\"%s\"",
132 stream_class
, bt_stream_class_get_id(stream_class
),
133 bt_stream_class_get_name(stream_class
),
134 expected_clock_class
,
135 expected_clock_class
?
136 bt_clock_class_get_name(expected_clock_class
) :
142 /* Validate the trace (if any), the stream class, and the event class */
143 trace
= bt_stream_class_get_trace(stream_class
);
145 BT_LOGD_STR("Event's class is part of a trace.");
146 packet_header_type
= bt_trace_get_packet_header_type(trace
);
147 trace_valid
= trace
->valid
;
149 environment
= trace
->environment
;
152 packet_context_type
= bt_stream_class_get_packet_context_type(
154 event_header_type
= bt_stream_class_get_event_header_type(
156 stream_event_ctx_type
= bt_stream_class_get_event_context_type(
158 event_context_type
= bt_event_class_get_context_type(event_class
);
159 event_payload_type
= bt_event_class_get_payload_type(event_class
);
160 ret
= bt_validate_class_types(environment
, packet_header_type
,
161 packet_context_type
, event_header_type
, stream_event_ctx_type
,
162 event_context_type
, event_payload_type
, trace_valid
,
163 stream_class
->valid
, event_class
->valid
,
164 &validation_output
, validation_flags
);
165 BT_PUT(packet_header_type
);
166 BT_PUT(packet_context_type
);
167 BT_PUT(event_header_type
);
168 BT_PUT(stream_event_ctx_type
);
169 BT_PUT(event_context_type
);
170 BT_PUT(event_payload_type
);
173 * This means something went wrong during the validation
174 * process, not that the objects are invalid.
176 BT_LOGE("Failed to validate event and parents: ret=%d", ret
);
180 if ((validation_output
.valid_flags
& validation_flags
) !=
182 /* Invalid trace/stream class/event class */
183 BT_LOGW("Invalid trace, stream class, or event class: "
184 "valid-flags=0x%x", validation_output
.valid_flags
);
189 * Safe to automatically map selected fields to the stream's
190 * clock's class here because the stream class is about to be
193 if (bt_stream_class_map_clock_class(stream_class
,
194 validation_output
.packet_context_type
,
195 validation_output
.event_header_type
)) {
196 BT_LOGW_STR("Cannot automatically map selected stream class's "
197 "field types to stream class's clock's class.");
202 * At this point we know the trace (if associated to the stream
203 * class), the stream class, and the event class, with their
204 * current types, are valid. We may proceed with creating
207 event
= g_new0(struct bt_event
, 1);
209 BT_LOGE_STR("Failed to allocate one event.");
213 bt_object_init(event
, bt_event_destroy
);
216 * event does not share a common ancestor with the event class; it has
217 * to guarantee its existence by holding a reference. This reference
218 * shall be released once the event is associated to a stream since,
219 * from that point, the event and its class will share the same
222 event
->event_class
= bt_get(event_class
);
223 event
->clock_values
= g_hash_table_new_full(g_direct_hash
,
224 g_direct_equal
, bt_put
, bt_put
);
226 if (validation_output
.event_header_type
) {
227 BT_LOGD("Creating initial event header field: ft-addr=%p",
228 validation_output
.event_header_type
);
230 bt_field_create(validation_output
.event_header_type
);
232 BT_LOGE_STR("Cannot create initial event header field object.");
237 if (validation_output
.stream_event_ctx_type
) {
238 BT_LOGD("Creating initial stream event context field: ft-addr=%p",
239 validation_output
.stream_event_ctx_type
);
240 stream_event_context
= bt_field_create(
241 validation_output
.stream_event_ctx_type
);
242 if (!stream_event_context
) {
243 BT_LOGE_STR("Cannot create initial stream event context field object.");
248 if (validation_output
.event_context_type
) {
249 BT_LOGD("Creating initial event context field: ft-addr=%p",
250 validation_output
.event_context_type
);
251 event_context
= bt_field_create(
252 validation_output
.event_context_type
);
253 if (!event_context
) {
254 BT_LOGE_STR("Cannot create initial event context field object.");
259 if (validation_output
.event_payload_type
) {
260 BT_LOGD("Creating initial event payload field: ft-addr=%p",
261 validation_output
.event_payload_type
);
262 event_payload
= bt_field_create(
263 validation_output
.event_payload_type
);
264 if (!event_payload
) {
265 BT_LOGE_STR("Cannot create initial event payload field object.");
271 * At this point all the fields are created, potentially from
272 * validated copies of field types, so that the field types and
273 * fields can be replaced in the trace, stream class,
274 * event class, and created event.
276 bt_validation_replace_types(trace
, stream_class
,
277 event_class
, &validation_output
, validation_flags
);
278 BT_MOVE(event
->event_header
, event_header
);
279 BT_MOVE(event
->stream_event_context
, stream_event_context
);
280 BT_MOVE(event
->context_payload
, event_context
);
281 BT_MOVE(event
->fields_payload
, event_payload
);
284 * Put what was not moved in bt_validation_replace_types().
286 bt_validation_output_put_types(&validation_output
);
289 * Freeze the stream class since the event header must not be changed
292 bt_stream_class_freeze(stream_class
);
295 * It is safe to set the stream class's unique clock class
296 * now because the stream class is frozen.
298 if (expected_clock_class
) {
299 BT_MOVE(stream_class
->clock_class
, expected_clock_class
);
303 * Mark stream class, and event class as valid since
304 * they're all frozen now.
306 stream_class
->valid
= 1;
307 event_class
->valid
= 1;
309 /* Put stuff we borrowed from the event class */
310 BT_PUT(stream_class
);
312 BT_LOGD("Created event object: addr=%p, event-class-name=\"%s\", "
313 "event-class-id=%" PRId64
,
314 event
, bt_event_class_get_name(event
->event_class
),
315 bt_event_class_get_id(event_class
));
319 bt_validation_output_put_types(&validation_output
);
321 BT_PUT(stream_class
);
323 BT_PUT(event_header
);
324 BT_PUT(stream_event_context
);
325 BT_PUT(event_context
);
326 BT_PUT(event_payload
);
327 bt_put(expected_clock_class
);
328 assert(!packet_header_type
);
329 assert(!packet_context_type
);
330 assert(!event_header_type
);
331 assert(!stream_event_ctx_type
);
332 assert(!event_context_type
);
333 assert(!event_payload_type
);
338 struct bt_event_class
*bt_event_get_class(struct bt_event
*event
)
340 struct bt_event_class
*event_class
= NULL
;
343 BT_LOGW_STR("Invalid parameter: event is NULL.");
347 event_class
= bt_get(bt_event_borrow_event_class(event
));
352 struct bt_stream
*bt_event_get_stream(struct bt_event
*event
)
354 struct bt_stream
*stream
= NULL
;
357 BT_LOGW_STR("Invalid parameter: event is NULL.");
362 * If the event has a parent, then this is its (writer) stream.
363 * If the event has no parent, then if it has a packet, this
364 * is its (non-writer) stream.
366 if (event
->base
.parent
) {
367 stream
= (struct bt_stream
*) bt_object_get_parent(event
);
370 stream
= bt_get(event
->packet
->stream
);
378 int bt_event_set_payload(struct bt_event
*event
,
380 struct bt_field
*payload
)
384 if (!event
|| !payload
) {
385 BT_LOGW("Invalid parameter: event or payload field is NULL: "
386 "event-addr=%p, payload-field-addr=%p",
393 BT_LOGW("Invalid parameter: event is frozen: addr=%p, "
394 "event-class-name=\"%s\", event-class-id=%" PRId64
,
395 event
, bt_event_class_get_name(event
->event_class
),
396 bt_event_class_get_id(event
->event_class
));
402 ret
= bt_field_structure_set_field_by_name(
403 event
->fields_payload
, name
, payload
);
405 struct bt_field_type
*payload_type
;
407 payload_type
= bt_field_get_type(payload
);
409 if (bt_field_type_compare(payload_type
,
410 event
->event_class
->fields
) == 0) {
411 bt_put(event
->fields_payload
);
413 event
->fields_payload
= payload
;
415 BT_LOGW("Invalid parameter: payload field type is different from the expected field type: "
416 "event-addr=%p, event-class-name=\"%s\", "
417 "event-class-id=%" PRId64
,
419 bt_event_class_get_name(event
->event_class
),
420 bt_event_class_get_id(event
->event_class
));
424 bt_put(payload_type
);
428 BT_LOGW("Failed to set event's payload field: event-addr=%p, "
429 "event-class-name=\"%s\", event-class-id=%" PRId64
", "
430 "payload-field-name=\"%s\", payload-field-addr=%p",
431 event
, bt_event_class_get_name(event
->event_class
),
432 bt_event_class_get_id(event
->event_class
),
435 BT_LOGV("Set event's payload field: event-addr=%p, "
436 "event-class-name=\"%s\", event-class-id=%" PRId64
", "
437 "payload-field-name=\"%s\", payload-field-addr=%p",
438 event
, bt_event_class_get_name(event
->event_class
),
439 bt_event_class_get_id(event
->event_class
),
447 struct bt_field
*bt_event_get_event_payload(struct bt_event
*event
)
449 struct bt_field
*payload
= NULL
;
452 BT_LOGW_STR("Invalid parameter: event is NULL.");
456 if (!event
->fields_payload
) {
457 BT_LOGV("Event has no current payload field: addr=%p, "
458 "event-class-name=\"%s\", event-class-id=%" PRId64
,
459 event
, bt_event_class_get_name(event
->event_class
),
460 bt_event_class_get_id(event
->event_class
));
464 payload
= event
->fields_payload
;
470 int bt_event_set_event_payload(struct bt_event
*event
,
471 struct bt_field
*payload
)
473 return bt_event_set_payload(event
, NULL
, payload
);
476 struct bt_field
*bt_event_get_payload(struct bt_event
*event
,
479 struct bt_field
*field
= NULL
;
482 BT_LOGW_STR("Invalid parameter: event is NULL.");
487 field
= bt_field_structure_get_field_by_name(
488 event
->fields_payload
, name
);
490 field
= event
->fields_payload
;
497 struct bt_field
*bt_event_get_payload_by_index(
498 struct bt_event
*event
, uint64_t index
)
500 struct bt_field
*field
= NULL
;
503 BT_LOGW_STR("Invalid parameter: event is NULL.");
507 field
= bt_field_structure_get_field_by_index(event
->fields_payload
,
513 struct bt_field
*bt_event_get_header(
514 struct bt_event
*event
)
516 struct bt_field
*header
= NULL
;
519 BT_LOGW_STR("Invalid parameter: event is NULL.");
523 if (!event
->event_header
) {
524 BT_LOGV("Event has no current header field: addr=%p, "
525 "event-class-name=\"%s\", event-class-id=%" PRId64
,
526 event
, bt_event_class_get_name(event
->event_class
),
527 bt_event_class_get_id(event
->event_class
));
531 header
= event
->event_header
;
537 int bt_event_set_header(struct bt_event
*event
,
538 struct bt_field
*header
)
541 struct bt_field_type
*field_type
= NULL
;
542 struct bt_stream_class
*stream_class
= NULL
;
545 BT_LOGW_STR("Invalid parameter: event is NULL.");
551 BT_LOGW("Invalid parameter: event is frozen: addr=%p, "
552 "event-class-name=\"%s\", event-class-id=%" PRId64
,
553 event
, bt_event_class_get_name(event
->event_class
),
554 bt_event_class_get_id(event
->event_class
));
559 stream_class
= (struct bt_stream_class
*) bt_object_get_parent(
562 * Ensure the provided header's type matches the one registered to the
566 field_type
= bt_field_get_type(header
);
567 if (bt_field_type_compare(field_type
,
568 stream_class
->event_header_type
)) {
569 BT_LOGW("Invalid parameter: header field type is different from the expected field type: "
570 "event-addr=%p, event-class-name=\"%s\", "
571 "event-class-id=%" PRId64
,
573 bt_event_class_get_name(event
->event_class
),
574 bt_event_class_get_id(event
->event_class
));
579 if (stream_class
->event_header_type
) {
580 BT_LOGW("Invalid parameter: setting no event header but event header field type is not NULL: "
581 "event-addr=%p, event-class-name=\"%s\", "
582 "event-class-id=%" PRId64
", "
583 "event-header-ft-addr=%p",
585 bt_event_class_get_name(event
->event_class
),
586 bt_event_class_get_id(event
->event_class
),
587 stream_class
->event_header_type
);
593 bt_put(event
->event_header
);
594 event
->event_header
= bt_get(header
);
595 BT_LOGV("Set event's header field: event-addr=%p, "
596 "event-class-name=\"%s\", event-class-id=%" PRId64
", "
597 "header-field-addr=%p",
598 event
, bt_event_class_get_name(event
->event_class
),
599 bt_event_class_get_id(event
->event_class
), header
);
601 bt_put(stream_class
);
606 struct bt_field
*bt_event_get_event_context(
607 struct bt_event
*event
)
609 struct bt_field
*context
= NULL
;
612 BT_LOGW_STR("Invalid parameter: event is NULL.");
616 if (!event
->context_payload
) {
617 BT_LOGV("Event has no current context field: addr=%p, "
618 "event-class-name=\"%s\", event-class-id=%" PRId64
,
619 event
, bt_event_class_get_name(event
->event_class
),
620 bt_event_class_get_id(event
->event_class
));
624 context
= event
->context_payload
;
630 int bt_event_set_event_context(struct bt_event
*event
,
631 struct bt_field
*context
)
634 struct bt_field_type
*field_type
= NULL
;
637 BT_LOGW_STR("Invalid parameter: event is NULL.");
643 BT_LOGW("Invalid parameter: event is frozen: addr=%p, "
644 "event-class-name=\"%s\", event-class-id=%" PRId64
,
645 event
, bt_event_class_get_name(event
->event_class
),
646 bt_event_class_get_id(event
->event_class
));
652 field_type
= bt_field_get_type(context
);
654 if (bt_field_type_compare(field_type
,
655 event
->event_class
->context
)) {
656 BT_LOGW("Invalid parameter: context field type is different from the expected field type: "
657 "event-addr=%p, event-class-name=\"%s\", "
658 "event-class-id=%" PRId64
,
660 bt_event_class_get_name(event
->event_class
),
661 bt_event_class_get_id(event
->event_class
));
666 if (event
->event_class
->context
) {
667 BT_LOGW("Invalid parameter: setting no event context but event context field type is not NULL: "
668 "event-addr=%p, event-class-name=\"%s\", "
669 "event-class-id=%" PRId64
", "
670 "event-context-ft-addr=%p",
672 bt_event_class_get_name(event
->event_class
),
673 bt_event_class_get_id(event
->event_class
),
674 event
->event_class
->context
);
680 bt_put(event
->context_payload
);
681 event
->context_payload
= bt_get(context
);
682 BT_LOGV("Set event's context field: event-addr=%p, "
683 "event-class-name=\"%s\", event-class-id=%" PRId64
", "
684 "context-field-addr=%p",
685 event
, bt_event_class_get_name(event
->event_class
),
686 bt_event_class_get_id(event
->event_class
), context
);
692 struct bt_field
*bt_event_get_stream_event_context(
693 struct bt_event
*event
)
695 struct bt_field
*stream_event_context
= NULL
;
698 BT_LOGW_STR("Invalid parameter: event is NULL.");
702 if (!event
->stream_event_context
) {
703 BT_LOGV("Event has no current stream event context field: addr=%p, "
704 "event-class-name=\"%s\", event-class-id=%" PRId64
,
705 event
, bt_event_class_get_name(event
->event_class
),
706 bt_event_class_get_id(event
->event_class
));
710 stream_event_context
= event
->stream_event_context
;
712 return bt_get(stream_event_context
);
715 int bt_event_set_stream_event_context(struct bt_event
*event
,
716 struct bt_field
*stream_event_context
)
719 struct bt_field_type
*field_type
= NULL
;
720 struct bt_stream_class
*stream_class
= NULL
;
723 BT_LOGW_STR("Invalid parameter: event is NULL.");
729 BT_LOGW("Invalid parameter: event is frozen: addr=%p, "
730 "event-class-name=\"%s\", event-class-id=%" PRId64
,
731 event
, bt_event_class_get_name(event
->event_class
),
732 bt_event_class_get_id(event
->event_class
));
737 stream_class
= bt_event_class_get_stream_class(event
->event_class
);
739 * We should not have been able to create the event without associating
740 * the event class to a stream class.
742 assert(stream_class
);
744 if (stream_event_context
) {
745 field_type
= bt_field_get_type(stream_event_context
);
746 if (bt_field_type_compare(field_type
,
747 stream_class
->event_context_type
)) {
748 BT_LOGW("Invalid parameter: stream event context field type is different from the expected field type: "
749 "event-addr=%p, event-class-name=\"%s\", "
750 "event-class-id=%" PRId64
,
752 bt_event_class_get_name(event
->event_class
),
753 bt_event_class_get_id(event
->event_class
));
758 if (stream_class
->event_context_type
) {
759 BT_LOGW("Invalid parameter: setting no stream event context but stream event context field type is not NULL: "
760 "event-addr=%p, event-class-name=\"%s\", "
761 "event-class-id=%" PRId64
", "
762 "stream-event-context-ft-addr=%p",
764 bt_event_class_get_name(event
->event_class
),
765 bt_event_class_get_id(event
->event_class
),
766 stream_class
->event_context_type
);
772 bt_get(stream_event_context
);
773 BT_MOVE(event
->stream_event_context
, stream_event_context
);
774 BT_LOGV("Set event's stream event context field: event-addr=%p, "
775 "event-class-name=\"%s\", event-class-id=%" PRId64
", "
776 "stream-event-context-field-addr=%p",
777 event
, bt_event_class_get_name(event
->event_class
),
778 bt_event_class_get_id(event
->event_class
),
779 stream_event_context
);
781 BT_PUT(stream_class
);
786 /* Pre-2.0 CTF writer backward compatibility */
787 void bt_ctf_event_get(struct bt_event
*event
)
792 /* Pre-2.0 CTF writer backward compatibility */
793 void bt_ctf_event_put(struct bt_event
*event
)
798 void bt_event_destroy(struct bt_object
*obj
)
800 struct bt_event
*event
;
802 event
= container_of(obj
, struct bt_event
, base
);
803 BT_LOGD("Destroying event: addr=%p, "
804 "event-class-name=\"%s\", event-class-id=%" PRId64
,
805 event
, bt_event_class_get_name(event
->event_class
),
806 bt_event_class_get_id(event
->event_class
));
808 if (!event
->base
.parent
) {
810 * Event was keeping a reference to its class since it shared no
811 * common ancestor with it to guarantee they would both have the
814 bt_put(event
->event_class
);
816 g_hash_table_destroy(event
->clock_values
);
817 BT_LOGD_STR("Putting event's header field.");
818 bt_put(event
->event_header
);
819 BT_LOGD_STR("Putting event's stream event context field.");
820 bt_put(event
->stream_event_context
);
821 BT_LOGD_STR("Putting event's context field.");
822 bt_put(event
->context_payload
);
823 BT_LOGD_STR("Putting event's payload field.");
824 bt_put(event
->fields_payload
);
825 BT_LOGD_STR("Putting event's packet.");
826 bt_put(event
->packet
);
830 struct bt_clock_value
*bt_event_get_clock_value(
831 struct bt_event
*event
, struct bt_clock_class
*clock_class
)
833 struct bt_clock_value
*clock_value
= NULL
;
835 if (!event
|| !clock_class
) {
836 BT_LOGW("Invalid parameter: event or clock class is NULL: "
837 "event-addr=%p, clock-class-addr=%p",
842 clock_value
= g_hash_table_lookup(event
->clock_values
, clock_class
);
844 BT_LOGV("No clock value associated to the given clock class: "
845 "event-addr=%p, event-class-name=\"%s\", "
846 "event-class-id=%" PRId64
", clock-class-addr=%p, "
847 "clock-class-name=\"%s\"", event
,
848 bt_event_class_get_name(event
->event_class
),
849 bt_event_class_get_id(event
->event_class
),
850 clock_class
, bt_clock_class_get_name(clock_class
));
859 int bt_event_set_clock_value(struct bt_event
*event
,
860 struct bt_clock_value
*value
)
863 struct bt_trace
*trace
;
864 struct bt_stream_class
*stream_class
;
865 struct bt_event_class
*event_class
;
866 struct bt_clock_class
*clock_class
= NULL
;
868 if (!event
|| !value
) {
869 BT_LOGW("Invalid parameter: event or clock value is NULL: "
870 "event-addr=%p, clock-value-addr=%p",
877 BT_LOGW("Invalid parameter: event is frozen: addr=%p, "
878 "event-class-name=\"%s\", event-class-id=%" PRId64
,
879 event
, bt_event_class_get_name(event
->event_class
),
880 bt_event_class_get_id(event
->event_class
));
885 clock_class
= bt_clock_value_get_class(value
);
886 event_class
= bt_event_borrow_event_class(event
);
888 stream_class
= bt_event_class_borrow_stream_class(event_class
);
889 assert(stream_class
);
890 trace
= bt_stream_class_borrow_trace(stream_class
);
893 if (!bt_trace_has_clock_class(trace
, clock_class
)) {
894 BT_LOGW("Invalid parameter: clock class is not part of event's trace: "
895 "event-addr=%p, event-class-name=\"%s\", "
896 "event-class-id=%" PRId64
", clock-class-addr=%p, "
897 "clock-class-name=\"%s\"",
898 event
, bt_event_class_get_name(event
->event_class
),
899 bt_event_class_get_id(event
->event_class
),
900 clock_class
, bt_clock_class_get_name(clock_class
));
905 g_hash_table_insert(event
->clock_values
, clock_class
, bt_get(value
));
906 BT_LOGV("Set event's clock value: "
907 "event-addr=%p, event-class-name=\"%s\", "
908 "event-class-id=%" PRId64
", clock-class-addr=%p, "
909 "clock-class-name=\"%s\", clock-value-addr=%p, "
910 "clock-value-cycles=%" PRIu64
,
911 event
, bt_event_class_get_name(event
->event_class
),
912 bt_event_class_get_id(event
->event_class
),
913 clock_class
, bt_clock_class_get_name(clock_class
),
914 value
, value
->value
);
923 int bt_event_validate(struct bt_event
*event
)
925 /* Make sure each field's payload has been set */
927 struct bt_stream_class
*stream_class
= NULL
;
930 if (event
->event_header
) {
931 ret
= bt_field_validate(event
->event_header
);
933 BT_LOGD("Invalid event's header field: "
934 "event-addr=%p, event-class-name=\"%s\", "
935 "event-class-id=%" PRId64
,
936 event
, bt_event_class_get_name(event
->event_class
),
937 bt_event_class_get_id(event
->event_class
));
942 stream_class
= bt_event_class_get_stream_class(event
->event_class
);
944 * We should not have been able to create the event without associating
945 * the event class to a stream class.
947 assert(stream_class
);
948 if (stream_class
->event_context_type
) {
949 ret
= bt_field_validate(event
->stream_event_context
);
951 BT_LOGD("Invalid event's stream event context field: "
952 "event-addr=%p, event-class-name=\"%s\", "
953 "event-class-id=%" PRId64
,
955 bt_event_class_get_name(event
->event_class
),
956 bt_event_class_get_id(event
->event_class
));
961 ret
= bt_field_validate(event
->fields_payload
);
963 BT_LOGD("Invalid event's payload field: "
964 "event-addr=%p, event-class-name=\"%s\", "
965 "event-class-id=%" PRId64
,
967 bt_event_class_get_name(event
->event_class
),
968 bt_event_class_get_id(event
->event_class
));
972 if (event
->event_class
->context
) {
973 BT_LOGD("Invalid event's context field: "
974 "event-addr=%p, event-class-name=\"%s\", "
975 "event-class-id=%" PRId64
,
977 bt_event_class_get_name(event
->event_class
),
978 bt_event_class_get_id(event
->event_class
));
979 ret
= bt_field_validate(event
->context_payload
);
982 bt_put(stream_class
);
987 int bt_event_serialize(struct bt_event
*event
,
988 struct bt_stream_pos
*pos
,
989 enum bt_byte_order native_byte_order
)
996 BT_LOGV_STR("Serializing event's context field.");
997 if (event
->context_payload
) {
998 ret
= bt_field_serialize(event
->context_payload
, pos
,
1001 BT_LOGW("Cannot serialize event's context field: "
1002 "event-addr=%p, event-class-name=\"%s\", "
1003 "event-class-id=%" PRId64
,
1005 bt_event_class_get_name(event
->event_class
),
1006 bt_event_class_get_id(event
->event_class
));
1011 BT_LOGV_STR("Serializing event's payload field.");
1012 if (event
->fields_payload
) {
1013 ret
= bt_field_serialize(event
->fields_payload
, pos
,
1016 BT_LOGW("Cannot serialize event's payload field: "
1017 "event-addr=%p, event-class-name=\"%s\", "
1018 "event-class-id=%" PRId64
,
1020 bt_event_class_get_name(event
->event_class
),
1021 bt_event_class_get_id(event
->event_class
));
1029 struct bt_packet
*bt_event_get_packet(struct bt_event
*event
)
1031 struct bt_packet
*packet
= NULL
;
1034 BT_LOGW_STR("Invalid parameter: event is NULL.");
1038 if (!event
->packet
) {
1039 BT_LOGV("Event has no current packet: addr=%p, "
1040 "event-class-name=\"%s\", event-class-id=%" PRId64
,
1041 event
, bt_event_class_get_name(event
->event_class
),
1042 bt_event_class_get_id(event
->event_class
));
1046 packet
= bt_get(event
->packet
);
1051 int bt_event_set_packet(struct bt_event
*event
,
1052 struct bt_packet
*packet
)
1054 struct bt_stream_class
*event_stream_class
= NULL
;
1055 struct bt_stream_class
*packet_stream_class
= NULL
;
1056 struct bt_stream
*stream
= NULL
;
1059 if (!event
|| !packet
) {
1060 BT_LOGW("Invalid parameter: event or packet is NULL: "
1061 "event-addr=%p, packet-addr=%p",
1067 if (event
->frozen
) {
1068 BT_LOGW("Invalid parameter: event is frozen: addr=%p, "
1069 "event-class-name=\"%s\", event-class-id=%" PRId64
,
1070 event
, bt_event_class_get_name(event
->event_class
),
1071 bt_event_class_get_id(event
->event_class
));
1077 * Make sure the new packet was created by this event's
1078 * stream, if it is set.
1080 stream
= bt_event_get_stream(event
);
1082 if (packet
->stream
!= stream
) {
1083 BT_LOGW("Invalid parameter: packet's stream and event's stream differ: "
1084 "event-addr=%p, event-class-name=\"%s\", "
1085 "event-class-id=%" PRId64
", packet-stream-addr=%p, "
1086 "event-stream-addr=%p",
1087 event
, bt_event_class_get_name(event
->event_class
),
1088 bt_event_class_get_id(event
->event_class
),
1089 packet
->stream
, stream
);
1094 event_stream_class
=
1095 bt_event_class_get_stream_class(event
->event_class
);
1096 packet_stream_class
=
1097 bt_stream_get_class(packet
->stream
);
1099 assert(event_stream_class
);
1100 assert(packet_stream_class
);
1102 if (event_stream_class
!= packet_stream_class
) {
1103 BT_LOGW("Invalid parameter: packet's stream class and event's stream class differ: "
1104 "event-addr=%p, event-class-name=\"%s\", "
1105 "event-class-id=%" PRId64
", packet-stream-class-addr=%p, "
1106 "event-stream-class-addr=%p",
1107 event
, bt_event_class_get_name(event
->event_class
),
1108 bt_event_class_get_id(event
->event_class
),
1109 packet_stream_class
, event_stream_class
);
1116 BT_MOVE(event
->packet
, packet
);
1117 BT_LOGV("Set event's packet: event-addr=%p, "
1118 "event-class-name=\"%s\", event-class-id=%" PRId64
", "
1120 event
, bt_event_class_get_name(event
->event_class
),
1121 bt_event_class_get_id(event
->event_class
), packet
);
1125 BT_PUT(event_stream_class
);
1126 BT_PUT(packet_stream_class
);
1132 void bt_event_freeze(struct bt_event
*event
)
1136 if (event
->frozen
) {
1140 BT_LOGD("Freezing event: addr=%p, "
1141 "event-class-name=\"%s\", event-class-id=%" PRId64
,
1142 event
, bt_event_class_get_name(event
->event_class
),
1143 bt_event_class_get_id(event
->event_class
));
1144 bt_packet_freeze(event
->packet
);
1145 BT_LOGD_STR("Freezing event's header field.");
1146 bt_field_freeze(event
->event_header
);
1147 BT_LOGD_STR("Freezing event's stream event context field.");
1148 bt_field_freeze(event
->stream_event_context
);
1149 BT_LOGD_STR("Freezing event's context field.");
1150 bt_field_freeze(event
->context_payload
);
1151 BT_LOGD_STR("Freezing event's payload field.");
1152 bt_field_freeze(event
->fields_payload
);