Commit | Line | Data |
---|---|---|
273b65be | 1 | /* |
0235b0db MJ |
2 | * SPDX-License-Identifier: MIT |
3 | * | |
e2f7325d | 4 | * Copyright 2017-2018 Philippe Proulx <pproulx@efficios.com> |
de9dd397 | 5 | * Copyright 2013, 2014 Jérémie Galarneau <jeremie.galarneau@efficios.com> |
273b65be JG |
6 | */ |
7 | ||
350ad6c1 | 8 | #define BT_LOG_TAG "LIB/EVENT" |
c2d9d9cf | 9 | #include "lib/logging.h" |
7b010242 | 10 | |
d98421f2 | 11 | #include "lib/assert-cond.h" |
43c59509 | 12 | #include <babeltrace2/trace-ir/event.h> |
3fadfbc0 | 13 | #include <babeltrace2/trace-ir/event-class.h> |
3fadfbc0 | 14 | #include <babeltrace2/trace-ir/stream-class.h> |
3fadfbc0 | 15 | #include <babeltrace2/trace-ir/packet.h> |
3fadfbc0 | 16 | #include <babeltrace2/trace-ir/trace.h> |
578e048b MJ |
17 | #include "common/assert.h" |
18 | #include "compat/compiler.h" | |
7b010242 | 19 | #include <inttypes.h> |
c4f23e30 | 20 | #include <stdbool.h> |
273b65be | 21 | |
578e048b MJ |
22 | #include "field.h" |
23 | #include "field-class.h" | |
24 | #include "event.h" | |
25 | #include "stream-class.h" | |
26 | #include "stream.h" | |
27 | #include "packet.h" | |
28 | #include "trace.h" | |
29 | #include "packet.h" | |
30 | #include "attributes.h" | |
31 | #include "event-class.h" | |
32 | ||
40f4ba76 | 33 | void _bt_event_set_is_frozen(const struct bt_event *event, bool is_frozen) |
3dca2276 | 34 | { |
98b15851 | 35 | BT_ASSERT_DBG(event); |
44c440bc PP |
36 | BT_LIB_LOGD("Setting event's frozen state: %!+e, is-frozen=%d", |
37 | event, is_frozen); | |
312c056a | 38 | |
44c440bc PP |
39 | if (event->common_context_field) { |
40 | BT_LOGD_STR("Setting event's common context field's frozen state."); | |
41 | bt_field_set_is_frozen( | |
42 | event->common_context_field, is_frozen); | |
312c056a PP |
43 | } |
44 | ||
44c440bc PP |
45 | if (event->specific_context_field) { |
46 | BT_LOGD_STR("Setting event's specific context field's frozen state."); | |
47 | bt_field_set_is_frozen(event->specific_context_field, | |
6c677fb5 | 48 | is_frozen); |
312c056a PP |
49 | } |
50 | ||
51 | if (event->payload_field) { | |
44c440bc PP |
52 | BT_LOGD_STR("Setting event's payload field's frozen state."); |
53 | bt_field_set_is_frozen(event->payload_field, | |
6c677fb5 | 54 | is_frozen); |
312c056a PP |
55 | } |
56 | ||
40f4ba76 | 57 | ((struct bt_event *) event)->frozen = is_frozen; |
26fc5aed PP |
58 | |
59 | if (event->packet) { | |
60 | BT_LOGD_STR("Setting event's packet's frozen state."); | |
61 | bt_packet_set_is_frozen(event->packet, is_frozen); | |
62 | } | |
3dca2276 PP |
63 | } |
64 | ||
312c056a | 65 | struct bt_event *bt_event_new(struct bt_event_class *event_class) |
3dca2276 | 66 | { |
3dca2276 | 67 | struct bt_event *event = NULL; |
312c056a | 68 | struct bt_stream_class *stream_class; |
5cd6d0e5 | 69 | struct bt_field_class *fc; |
3dca2276 | 70 | |
44c440bc | 71 | BT_ASSERT(event_class); |
3dca2276 PP |
72 | event = g_new0(struct bt_event, 1); |
73 | if (!event) { | |
870631a2 | 74 | BT_LIB_LOGE_APPEND_CAUSE("Failed to allocate one event."); |
3dca2276 PP |
75 | goto error; |
76 | } | |
77 | ||
44c440bc | 78 | bt_object_init_unique(&event->base); |
312c056a PP |
79 | stream_class = bt_event_class_borrow_stream_class(event_class); |
80 | BT_ASSERT(stream_class); | |
40f4ba76 | 81 | fc = stream_class->event_common_context_fc; |
5cd6d0e5 PP |
82 | if (fc) { |
83 | event->common_context_field = bt_field_create(fc); | |
44c440bc PP |
84 | if (!event->common_context_field) { |
85 | /* bt_field_create() logs errors */ | |
86 | goto error; | |
87 | } | |
88 | } | |
89 | ||
40f4ba76 | 90 | fc = event_class->specific_context_fc; |
5cd6d0e5 PP |
91 | if (fc) { |
92 | event->specific_context_field = bt_field_create(fc); | |
44c440bc PP |
93 | if (!event->specific_context_field) { |
94 | /* bt_field_create() logs errors */ | |
95 | goto error; | |
96 | } | |
97 | } | |
98 | ||
40f4ba76 | 99 | fc = event_class->payload_fc; |
5cd6d0e5 PP |
100 | if (fc) { |
101 | event->payload_field = bt_field_create(fc); | |
44c440bc PP |
102 | if (!event->payload_field) { |
103 | /* bt_field_create() logs errors */ | |
104 | goto error; | |
105 | } | |
106 | } | |
107 | ||
3dca2276 PP |
108 | goto end; |
109 | ||
110 | error: | |
312c056a PP |
111 | if (event) { |
112 | bt_event_destroy(event); | |
113 | event = NULL; | |
114 | } | |
115 | ||
116 | end: | |
117 | return event; | |
118 | } | |
119 | ||
1353b066 | 120 | BT_EXPORT |
094ff7c0 | 121 | struct bt_event_class *bt_event_borrow_class(struct bt_event *event) |
2f100782 | 122 | { |
d5b13b9b | 123 | BT_ASSERT_PRE_DEV_EVENT_NON_NULL(event); |
cb6f1f7d | 124 | return event->class; |
2f100782 JG |
125 | } |
126 | ||
1353b066 | 127 | BT_EXPORT |
40f4ba76 PP |
128 | const struct bt_event_class *bt_event_borrow_class_const( |
129 | const struct bt_event *event) | |
130 | { | |
131 | return bt_event_borrow_class((void *) event); | |
132 | } | |
133 | ||
1353b066 | 134 | BT_EXPORT |
f6ccaed9 | 135 | struct bt_stream *bt_event_borrow_stream(struct bt_event *event) |
f6ccaed9 | 136 | { |
d5b13b9b | 137 | BT_ASSERT_PRE_DEV_EVENT_NON_NULL(event); |
26fc5aed | 138 | return event->stream; |
f6ccaed9 PP |
139 | } |
140 | ||
1353b066 | 141 | BT_EXPORT |
40f4ba76 PP |
142 | const struct bt_stream *bt_event_borrow_stream_const( |
143 | const struct bt_event *event) | |
144 | { | |
145 | return bt_event_borrow_stream((void *) event); | |
146 | } | |
147 | ||
1353b066 | 148 | BT_EXPORT |
44c440bc | 149 | struct bt_field *bt_event_borrow_common_context_field(struct bt_event *event) |
662e778c | 150 | { |
d5b13b9b | 151 | BT_ASSERT_PRE_DEV_EVENT_NON_NULL(event); |
44c440bc | 152 | return event->common_context_field; |
662e778c JG |
153 | } |
154 | ||
1353b066 | 155 | BT_EXPORT |
40f4ba76 PP |
156 | const struct bt_field *bt_event_borrow_common_context_field_const( |
157 | const struct bt_event *event) | |
e5be10ef | 158 | { |
d5b13b9b | 159 | BT_ASSERT_PRE_DEV_EVENT_NON_NULL(event); |
40f4ba76 | 160 | return event->common_context_field; |
e5be10ef PP |
161 | } |
162 | ||
1353b066 | 163 | BT_EXPORT |
44c440bc | 164 | struct bt_field *bt_event_borrow_specific_context_field(struct bt_event *event) |
f655a84d | 165 | { |
d5b13b9b | 166 | BT_ASSERT_PRE_DEV_EVENT_NON_NULL(event); |
44c440bc | 167 | return event->specific_context_field; |
f655a84d JG |
168 | } |
169 | ||
1353b066 | 170 | BT_EXPORT |
40f4ba76 PP |
171 | const struct bt_field *bt_event_borrow_specific_context_field_const( |
172 | const struct bt_event *event) | |
e5be10ef | 173 | { |
d5b13b9b | 174 | BT_ASSERT_PRE_DEV_EVENT_NON_NULL(event); |
40f4ba76 | 175 | return event->specific_context_field; |
e5be10ef PP |
176 | } |
177 | ||
1353b066 | 178 | BT_EXPORT |
44c440bc | 179 | struct bt_field *bt_event_borrow_payload_field(struct bt_event *event) |
5fd2e9fd | 180 | { |
d5b13b9b | 181 | BT_ASSERT_PRE_DEV_EVENT_NON_NULL(event); |
44c440bc | 182 | return event->payload_field; |
5fd2e9fd PP |
183 | } |
184 | ||
1353b066 | 185 | BT_EXPORT |
40f4ba76 PP |
186 | const struct bt_field *bt_event_borrow_payload_field_const( |
187 | const struct bt_event *event) | |
e5be10ef | 188 | { |
d5b13b9b | 189 | BT_ASSERT_PRE_DEV_EVENT_NON_NULL(event); |
40f4ba76 | 190 | return event->payload_field; |
e5be10ef PP |
191 | } |
192 | ||
44c440bc | 193 | void bt_event_destroy(struct bt_event *event) |
cb6f1f7d | 194 | { |
44c440bc PP |
195 | BT_ASSERT(event); |
196 | BT_LIB_LOGD("Destroying event: %!+e", event); | |
cb6f1f7d | 197 | |
44c440bc PP |
198 | if (event->common_context_field) { |
199 | BT_LOGD_STR("Destroying event's stream event context field."); | |
200 | bt_field_destroy(event->common_context_field); | |
238b7404 | 201 | event->common_context_field = NULL; |
cb6f1f7d PP |
202 | } |
203 | ||
44c440bc PP |
204 | if (event->specific_context_field) { |
205 | BT_LOGD_STR("Destroying event's context field."); | |
206 | bt_field_destroy(event->specific_context_field); | |
238b7404 | 207 | event->specific_context_field = NULL; |
cb6f1f7d PP |
208 | } |
209 | ||
210 | if (event->payload_field) { | |
44c440bc PP |
211 | BT_LOGD_STR("Destroying event's payload field."); |
212 | bt_field_destroy(event->payload_field); | |
238b7404 | 213 | event->payload_field = NULL; |
cb6f1f7d PP |
214 | } |
215 | ||
44c440bc | 216 | BT_LOGD_STR("Putting event's class."); |
65300d60 | 217 | bt_object_put_ref(event->class); |
03039f21 | 218 | BT_LOGD_STR("Putting event's packet."); |
238b7404 | 219 | BT_OBJECT_PUT_REF_AND_RESET(event->packet); |
26fc5aed PP |
220 | BT_LOGD_STR("Putting event's stream."); |
221 | BT_OBJECT_PUT_REF_AND_RESET(event->stream); | |
273b65be JG |
222 | g_free(event); |
223 | } | |
224 | ||
1353b066 | 225 | BT_EXPORT |
094ff7c0 | 226 | struct bt_packet *bt_event_borrow_packet(struct bt_event *event) |
5c0f40f4 | 227 | { |
d5b13b9b | 228 | BT_ASSERT_PRE_DEV_EVENT_NON_NULL(event); |
44c440bc | 229 | return event->packet; |
5c0f40f4 JG |
230 | } |
231 | ||
1353b066 | 232 | BT_EXPORT |
40f4ba76 PP |
233 | const struct bt_packet *bt_event_borrow_packet_const( |
234 | const struct bt_event *event) | |
e5be10ef | 235 | { |
40f4ba76 | 236 | return bt_event_borrow_packet((void *) event); |
e5be10ef | 237 | } |