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