2 * SPDX-License-Identifier: MIT
4 * Copyright 2013, 2014 Jérémie Galarneau <jeremie.galarneau@efficios.com>
6 * The Common Trace Format (CTF) Specification is available at
7 * http://www.efficios.com/ctf
10 #ifndef BABELTRACE_CTF_WRITER_EVENT_INTERNAL_H
11 #define BABELTRACE_CTF_WRITER_EVENT_INTERNAL_H
15 #include "common/assert.h"
16 #include "common/macros.h"
17 #include <babeltrace2-ctf-writer/field-types.h>
18 #include <babeltrace2-ctf-writer/fields.h>
19 #include <babeltrace2-ctf-writer/stream-class.h>
20 #include <babeltrace2-ctf-writer/stream.h>
21 #include "ctfser/ctfser.h"
23 #include "assert-pre.h"
24 #include "event-class.h"
27 #include "field-wrapper.h"
30 #include "validation.h"
33 struct bt_ctf_stream_class
;
34 struct bt_ctf_stream_pos
;
35 struct metadata_context
;
37 struct bt_ctf_event_common
{
38 struct bt_ctf_object base
;
39 struct bt_ctf_event_class_common
*class;
40 struct bt_ctf_field_wrapper
*header_field
;
41 struct bt_ctf_field_common
*stream_event_context_field
;
42 struct bt_ctf_field_common
*context_field
;
43 struct bt_ctf_field_common
*payload_field
;
47 int _bt_ctf_event_common_validate(struct bt_ctf_event_common
*event
);
49 void _bt_ctf_event_common_set_is_frozen(struct bt_ctf_event_common
*event
,
53 # define bt_ctf_event_common_validate _bt_ctf_event_common_validate
54 # define bt_ctf_event_common_set_is_frozen _bt_ctf_event_common_set_is_frozen
56 # define bt_ctf_event_common_validate(_event) 0
57 # define bt_ctf_event_common_set_is_frozen(_event, _is_frozen)
60 #define BT_CTF_ASSERT_PRE_EVENT_COMMON_HOT(_event, _name) \
61 BT_CTF_ASSERT_PRE_HOT((_event), (_name), ": event-addr=%p", (_event))
64 struct bt_ctf_event_class_common
*bt_ctf_event_common_borrow_class(
65 struct bt_ctf_event_common
*event
)
71 typedef void *(*create_field_func_type
)(void *);
72 typedef void (*release_field_func_type
)(void *);
73 typedef void *(*create_header_field_func_type
)(void *, void *);
74 typedef void (*release_header_field_func_type
)(void *, void *);
76 int bt_ctf_event_common_initialize(struct bt_ctf_event_common
*event
,
77 struct bt_ctf_event_class_common
*event_class
,
78 struct bt_ctf_clock_class
*init_expected_clock_class
,
79 bool is_shared_with_parent
, bt_ctf_object_release_func release_func
,
80 bt_ctf_validation_flag_copy_field_type_func field_type_copy_func
,
81 bool must_be_in_trace
,
82 int (*map_clock_classes_func
)(struct bt_ctf_stream_class_common
*stream_class
,
83 struct bt_ctf_field_type_common
*packet_context_field_type
,
84 struct bt_ctf_field_type_common
*event_header_field_type
),
85 create_field_func_type create_field_func
,
86 release_field_func_type release_field_func
,
87 create_header_field_func_type create_header_field_func
,
88 release_header_field_func_type release_header_field_func
);
90 int bt_ctf_event_common_set_payload(struct bt_ctf_event
*event
,
91 struct bt_ctf_field
*payload
);
94 struct bt_ctf_field_common
*bt_ctf_event_common_borrow_payload(
95 struct bt_ctf_event_common
*event
)
97 struct bt_ctf_field_common
*payload
= NULL
;
99 BT_CTF_ASSERT_PRE_NON_NULL(event
, "Event");
101 if (!event
->payload_field
) {
102 BT_LOGT("Event has no current payload field: addr=%p, "
103 "event-class-name=\"%s\", event-class-id=%" PRId64
,
104 event
, bt_ctf_event_class_common_get_name(event
->class),
105 bt_ctf_event_class_common_get_id(event
->class));
109 payload
= event
->payload_field
;
116 struct bt_ctf_field_common
*bt_ctf_event_common_borrow_header(
117 struct bt_ctf_event_common
*event
)
119 struct bt_ctf_field_common
*header
= NULL
;
121 BT_CTF_ASSERT_PRE_NON_NULL(event
, "Event");
123 if (!event
->header_field
) {
124 BT_LOGT("Event has no current header field: addr=%p, "
125 "event-class-name=\"%s\", event-class-id=%" PRId64
,
126 event
, bt_ctf_event_class_common_get_name(event
->class),
127 bt_ctf_event_class_common_get_id(event
->class));
131 header
= event
->header_field
->field
;
138 struct bt_ctf_field_common
*bt_ctf_event_common_borrow_context(
139 struct bt_ctf_event_common
*event
)
141 struct bt_ctf_field_common
*context
= NULL
;
143 BT_CTF_ASSERT_PRE_NON_NULL(event
, "Event");
145 if (!event
->context_field
) {
146 BT_LOGT("Event has no current context field: addr=%p, "
147 "event-class-name=\"%s\", event-class-id=%" PRId64
,
148 event
, bt_ctf_event_class_common_get_name(event
->class),
149 bt_ctf_event_class_common_get_id(event
->class));
153 context
= event
->context_field
;
160 struct bt_ctf_field_common
*bt_ctf_event_common_borrow_stream_event_context(
161 struct bt_ctf_event_common
*event
)
163 struct bt_ctf_field_common
*stream_event_context
= NULL
;
165 BT_CTF_ASSERT_PRE_NON_NULL(event
, "Event");
167 if (!event
->stream_event_context_field
) {
168 BT_LOGT("Event has no current stream event context field: addr=%p, "
169 "event-class-name=\"%s\", event-class-id=%" PRId64
,
170 event
, bt_ctf_event_class_common_get_name(event
->class),
171 bt_ctf_event_class_common_get_id(event
->class));
175 stream_event_context
= event
->stream_event_context_field
;
178 return stream_event_context
;
182 void bt_ctf_event_common_finalize(struct bt_ctf_object
*obj
,
183 void (*field_release_func
)(void *),
184 void (*header_field_release_func
)(void *, struct bt_ctf_event_common
*))
186 struct bt_ctf_event_common
*event
= (void *) obj
;
188 BT_LOGD("Destroying event: addr=%p, "
189 "event-class-name=\"%s\", event-class-id=%" PRId64
,
191 event
->class ? bt_ctf_event_class_common_get_name(event
->class) : NULL
,
192 event
->class ? bt_ctf_event_class_common_get_id(event
->class) : INT64_C(-1));
194 if (event
->header_field
) {
195 BT_LOGD_STR("Releasing event's header field.");
196 header_field_release_func(event
->header_field
, event
);
199 if (event
->stream_event_context_field
) {
200 BT_LOGD_STR("Releasing event's stream event context field.");
201 field_release_func(event
->stream_event_context_field
);
204 if (event
->context_field
) {
205 BT_LOGD_STR("Releasing event's context field.");
206 field_release_func(event
->context_field
);
209 if (event
->payload_field
) {
210 BT_LOGD_STR("Releasing event's payload field.");
211 field_release_func(event
->payload_field
);
215 * Leave this after calling header_field_release_func() because
216 * this function receives the event object and could need its
217 * class to perform some cleanup.
219 if (!event
->base
.parent
) {
221 * Event was keeping a reference to its class since it shared no
222 * common ancestor with it to guarantee they would both have the
225 bt_ctf_object_put_ref(event
->class);
229 struct bt_ctf_event
{
230 struct bt_ctf_event_common common
;
233 struct bt_ctf_event_class
{
234 struct bt_ctf_event_class_common common
;
237 int bt_ctf_event_class_serialize(struct bt_ctf_event_class
*event_class
,
238 struct metadata_context
*context
);
240 int bt_ctf_event_serialize(struct bt_ctf_event
*event
,
241 struct bt_ctfser
*pos
,
242 enum bt_ctf_byte_order native_byte_order
);
245 struct bt_ctf_stream_class
*bt_ctf_event_class_borrow_stream_class(
246 struct bt_ctf_event_class
*event_class
)
248 return BT_CTF_FROM_COMMON(bt_ctf_event_class_common_borrow_stream_class(
249 BT_CTF_TO_COMMON(event_class
)));
252 #endif /* BABELTRACE_CTF_WRITER_EVENT_INTERNAL_H */