53130c4ba52c5dfb9157b592d9118485b514b1cd
2 * SPDX-License-Identifier: MIT
4 * Copyright 2017-2018 Philippe Proulx <pproulx@efficios.com>
5 * Copyright 2013, 2014 Jérémie Galarneau <jeremie.galarneau@efficios.com>
8 #ifndef BABELTRACE_TRACE_IR_EVENT_INTERNAL_H
9 #define BABELTRACE_TRACE_IR_EVENT_INTERNAL_H
11 /* Protection: this file uses BT_LIB_LOG*() macros directly */
12 #ifndef BT_LIB_LOG_SUPPORTED
13 # error Please include "lib/logging.h" before including this file.
16 #include "lib/assert-cond.h"
17 #include <babeltrace2/value.h>
18 #include <babeltrace2/trace-ir/stream-class.h>
19 #include <babeltrace2/trace-ir/stream.h>
20 #include <babeltrace2/trace-ir/packet.h>
21 #include <babeltrace2/trace-ir/field.h>
22 #include "lib/object.h"
23 #include "common/assert.h"
27 #include "event-class.h"
32 #define BT_ASSERT_PRE_DEV_EVENT_HOT(_event) \
33 BT_ASSERT_PRE_DEV_HOT(((const struct bt_event *) (_event)), \
34 "Event", ": %!+e", (_event))
37 struct bt_object base
;
40 struct bt_event_class
*class;
42 /* Owned by this (can be `NULL`) */
43 struct bt_packet
*packet
;
46 struct bt_stream
*stream
;
48 struct bt_field
*common_context_field
;
49 struct bt_field
*specific_context_field
;
50 struct bt_field
*payload_field
;
54 void bt_event_destroy(struct bt_event
*event
);
56 struct bt_event
*bt_event_new(struct bt_event_class
*event_class
);
58 void _bt_event_set_is_frozen(const struct bt_event
*event
, bool is_frozen
);
61 # define bt_event_set_is_frozen _bt_event_set_is_frozen
63 # define bt_event_set_is_frozen(_event, _is_frozen)
66 __attribute__((unused
))
68 void _bt_event_reset_dev_mode(struct bt_event
*event
)
72 if (event
->common_context_field
) {
73 bt_field_set_is_frozen(
74 event
->common_context_field
, false);
76 event
->common_context_field
);
79 if (event
->specific_context_field
) {
80 bt_field_set_is_frozen(
81 event
->specific_context_field
, false);
82 bt_field_reset(event
->specific_context_field
);
85 if (event
->payload_field
) {
86 bt_field_set_is_frozen(
87 event
->payload_field
, false);
88 bt_field_reset(event
->payload_field
);
93 # define bt_event_reset_dev_mode _bt_event_reset_dev_mode
95 # define bt_event_reset_dev_mode(_x)
99 void bt_event_reset(struct bt_event
*event
)
101 BT_ASSERT_DBG(event
);
102 BT_LIB_LOGD("Resetting event: %!+e", event
);
103 bt_event_set_is_frozen(event
, false);
104 bt_object_put_ref_no_null_check(&event
->stream
->base
);
105 event
->stream
= NULL
;
108 bt_object_put_ref_no_null_check(&event
->packet
->base
);
109 event
->packet
= NULL
;
114 void bt_event_recycle(struct bt_event
*event
)
116 struct bt_event_class
*event_class
;
118 BT_ASSERT_DBG(event
);
119 BT_LIB_LOGD("Recycling event: %!+e", event
);
122 * Those are the important ordered steps:
124 * 1. Reset the event object (put any permanent reference it
125 * has, unfreeze it and its fields in developer mode, etc.),
126 * but do NOT put its class's reference. This event class
127 * contains the pool to which we're about to recycle this
128 * event object, so we must guarantee its existence thanks
129 * to this existing reference.
131 * 2. Move the event class reference to our `event_class`
132 * variable so that we can set the event's class member
133 * to NULL before recycling it. We CANNOT do this after
134 * we put the event class reference because this bt_object_put_ref()
135 * could destroy the event class, also destroying its
136 * event pool, thus also destroying our event object (this
137 * would result in an invalid write access).
139 * 3. Recycle the event object.
141 * 4. Put our event class reference.
143 bt_event_reset(event
);
144 event_class
= event
->class;
145 BT_ASSERT_DBG(event_class
);
147 bt_object_pool_recycle_object(&event_class
->event_pool
, event
);
148 bt_object_put_ref_no_null_check(&event_class
->base
);
151 #endif /* BABELTRACE_TRACE_IR_EVENT_INTERNAL_H */
This page took 0.033699 seconds and 4 git commands to generate.