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
;
48 int _bt_ctf_event_common_validate(struct bt_ctf_event_common
*event
);
51 void _bt_ctf_event_common_set_is_frozen(struct bt_ctf_event_common
*event
,
55 # define bt_ctf_event_common_validate _bt_ctf_event_common_validate
56 # define bt_ctf_event_common_set_is_frozen _bt_ctf_event_common_set_is_frozen
58 # define bt_ctf_event_common_validate(_event) 0
59 # define bt_ctf_event_common_set_is_frozen(_event, _is_frozen)
62 #define BT_CTF_ASSERT_PRE_EVENT_COMMON_HOT(_event, _name) \
63 BT_CTF_ASSERT_PRE_HOT((_event), (_name), ": event-addr=%p", (_event))
66 struct bt_ctf_event_class_common
*bt_ctf_event_common_borrow_class(
67 struct bt_ctf_event_common
*event
)
73 typedef void *(*create_field_func_type
)(void *);
74 typedef void (*release_field_func_type
)(void *);
75 typedef void *(*create_header_field_func_type
)(void *, void *);
76 typedef void (*release_header_field_func_type
)(void *, void *);
79 int bt_ctf_event_common_initialize(struct bt_ctf_event_common
*event
,
80 struct bt_ctf_event_class_common
*event_class
,
81 struct bt_ctf_clock_class
*init_expected_clock_class
,
82 bool is_shared_with_parent
, bt_ctf_object_release_func release_func
,
83 bt_ctf_validation_flag_copy_field_type_func field_type_copy_func
,
84 bool must_be_in_trace
,
85 int (*map_clock_classes_func
)(struct bt_ctf_stream_class_common
*stream_class
,
86 struct bt_ctf_field_type_common
*packet_context_field_type
,
87 struct bt_ctf_field_type_common
*event_header_field_type
),
88 create_field_func_type create_field_func
,
89 release_field_func_type release_field_func
,
90 create_header_field_func_type create_header_field_func
,
91 release_header_field_func_type release_header_field_func
);
94 int bt_ctf_event_common_set_payload(struct bt_ctf_event
*event
,
95 struct bt_ctf_field
*payload
);
98 struct bt_ctf_field_common
*bt_ctf_event_common_borrow_payload(
99 struct bt_ctf_event_common
*event
)
101 struct bt_ctf_field_common
*payload
= NULL
;
103 BT_CTF_ASSERT_PRE_NON_NULL(event
, "Event");
105 if (!event
->payload_field
) {
106 BT_LOGT("Event has no current payload field: addr=%p, "
107 "event-class-name=\"%s\", event-class-id=%" PRId64
,
108 event
, bt_ctf_event_class_common_get_name(event
->class),
109 bt_ctf_event_class_common_get_id(event
->class));
113 payload
= event
->payload_field
;
120 struct bt_ctf_field_common
*bt_ctf_event_common_borrow_header(
121 struct bt_ctf_event_common
*event
)
123 struct bt_ctf_field_common
*header
= NULL
;
125 BT_CTF_ASSERT_PRE_NON_NULL(event
, "Event");
127 if (!event
->header_field
) {
128 BT_LOGT("Event has no current header field: addr=%p, "
129 "event-class-name=\"%s\", event-class-id=%" PRId64
,
130 event
, bt_ctf_event_class_common_get_name(event
->class),
131 bt_ctf_event_class_common_get_id(event
->class));
135 header
= event
->header_field
->field
;
142 struct bt_ctf_field_common
*bt_ctf_event_common_borrow_context(
143 struct bt_ctf_event_common
*event
)
145 struct bt_ctf_field_common
*context
= NULL
;
147 BT_CTF_ASSERT_PRE_NON_NULL(event
, "Event");
149 if (!event
->context_field
) {
150 BT_LOGT("Event has no current context field: addr=%p, "
151 "event-class-name=\"%s\", event-class-id=%" PRId64
,
152 event
, bt_ctf_event_class_common_get_name(event
->class),
153 bt_ctf_event_class_common_get_id(event
->class));
157 context
= event
->context_field
;
164 struct bt_ctf_field_common
*bt_ctf_event_common_borrow_stream_event_context(
165 struct bt_ctf_event_common
*event
)
167 struct bt_ctf_field_common
*stream_event_context
= NULL
;
169 BT_CTF_ASSERT_PRE_NON_NULL(event
, "Event");
171 if (!event
->stream_event_context_field
) {
172 BT_LOGT("Event has no current stream event context field: addr=%p, "
173 "event-class-name=\"%s\", event-class-id=%" PRId64
,
174 event
, bt_ctf_event_class_common_get_name(event
->class),
175 bt_ctf_event_class_common_get_id(event
->class));
179 stream_event_context
= event
->stream_event_context_field
;
182 return stream_event_context
;
186 void bt_ctf_event_common_finalize(struct bt_ctf_object
*obj
,
187 void (*field_release_func
)(void *),
188 void (*header_field_release_func
)(void *, struct bt_ctf_event_common
*))
190 struct bt_ctf_event_common
*event
= (void *) obj
;
192 BT_LOGD("Destroying event: addr=%p, "
193 "event-class-name=\"%s\", event-class-id=%" PRId64
,
195 event
->class ? bt_ctf_event_class_common_get_name(event
->class) : NULL
,
196 event
->class ? bt_ctf_event_class_common_get_id(event
->class) : INT64_C(-1));
198 if (event
->header_field
) {
199 BT_LOGD_STR("Releasing event's header field.");
200 header_field_release_func(event
->header_field
, event
);
203 if (event
->stream_event_context_field
) {
204 BT_LOGD_STR("Releasing event's stream event context field.");
205 field_release_func(event
->stream_event_context_field
);
208 if (event
->context_field
) {
209 BT_LOGD_STR("Releasing event's context field.");
210 field_release_func(event
->context_field
);
213 if (event
->payload_field
) {
214 BT_LOGD_STR("Releasing event's payload field.");
215 field_release_func(event
->payload_field
);
219 * Leave this after calling header_field_release_func() because
220 * this function receives the event object and could need its
221 * class to perform some cleanup.
223 if (!event
->base
.parent
) {
225 * Event was keeping a reference to its class since it shared no
226 * common ancestor with it to guarantee they would both have the
229 bt_ctf_object_put_ref(event
->class);
233 struct bt_ctf_event
{
234 struct bt_ctf_event_common common
;
237 struct bt_ctf_event_class
{
238 struct bt_ctf_event_class_common common
;
242 int bt_ctf_event_class_serialize(struct bt_ctf_event_class
*event_class
,
243 struct metadata_context
*context
);
246 int bt_ctf_event_serialize(struct bt_ctf_event
*event
,
247 struct bt_ctfser
*pos
,
248 enum bt_ctf_byte_order native_byte_order
);
251 struct bt_ctf_stream_class
*bt_ctf_event_class_borrow_stream_class(
252 struct bt_ctf_event_class
*event_class
)
254 return BT_CTF_FROM_COMMON(bt_ctf_event_class_common_borrow_stream_class(
255 BT_CTF_TO_COMMON(event_class
)));
258 #endif /* BABELTRACE_CTF_WRITER_EVENT_INTERNAL_H */