Commit | Line | Data |
---|---|---|
ca9f27f3 | 1 | /* |
0235b0db | 2 | * SPDX-License-Identifier: MIT |
ca9f27f3 FD |
3 | * |
4 | * Copyright (c) 2015 EfficiOS Inc. and Linux Foundation | |
5 | * Copyright (c) 2018 Philippe Proulx <pproulx@efficios.com> | |
6 | * Copyright (c) 2019 Francis Deslauriers <francis.deslauriers@efficios.com> | |
7 | * | |
0235b0db MJ |
8 | * Babeltrace - Mapping of IR metadata and data object between input and output |
9 | * trace | |
ca9f27f3 FD |
10 | */ |
11 | ||
91bc8451 | 12 | #define BT_COMP_LOG_SELF_COMP (ir_maps->self_comp) |
3a3d15f3 | 13 | #define BT_LOG_OUTPUT_LEVEL (ir_maps->log_level) |
350ad6c1 | 14 | #define BT_LOG_TAG "PLUGIN/FLT.LTTNG-UTILS.DEBUG-INFO/TRACE-IR-MAPPING" |
d9c39b0a | 15 | #include "logging/comp-logging.h" |
ca9f27f3 | 16 | |
578e048b | 17 | #include "common/assert.h" |
3fadfbc0 | 18 | #include <babeltrace2/babeltrace.h> |
ca9f27f3 FD |
19 | |
20 | #include "debug-info.h" | |
21 | #include "trace-ir-data-copy.h" | |
22 | #include "trace-ir-mapping.h" | |
23 | #include "trace-ir-metadata-copy.h" | |
24 | ||
25 | static | |
26 | bt_trace_class *create_new_mapped_trace_class(struct trace_ir_maps *ir_maps, | |
27 | const bt_trace_class *in_trace_class) | |
28 | { | |
3b34b490 FD |
29 | bt_self_component *self_comp = ir_maps->self_comp; |
30 | enum debug_info_trace_ir_mapping_status status; | |
db5d746d | 31 | struct trace_ir_metadata_maps *metadata_maps; |
ca9f27f3 | 32 | |
91bc8451 | 33 | BT_COMP_LOGD("Creating new mapped trace class: in-tc-addr=%p", in_trace_class); |
ca9f27f3 FD |
34 | |
35 | BT_ASSERT(ir_maps); | |
36 | BT_ASSERT(in_trace_class); | |
37 | ||
db5d746d FD |
38 | metadata_maps = borrow_metadata_maps_from_input_trace_class(ir_maps, |
39 | in_trace_class); | |
40 | ||
41 | BT_ASSERT(!metadata_maps->output_trace_class); | |
42 | ||
e7401568 | 43 | /* Create the output trace class. */ |
db5d746d FD |
44 | metadata_maps->output_trace_class = |
45 | bt_trace_class_create(ir_maps->self_comp); | |
46 | if (!metadata_maps->output_trace_class) { | |
3b34b490 FD |
47 | BT_COMP_LOGE_APPEND_CAUSE(self_comp, |
48 | "Error create output trace class"); | |
49 | goto error; | |
ca9f27f3 FD |
50 | } |
51 | ||
db5d746d | 52 | /* Copy the content over and add to the mapping. */ |
3b34b490 | 53 | status = copy_trace_class_content(ir_maps, in_trace_class, |
db5d746d FD |
54 | metadata_maps->output_trace_class, ir_maps->log_level, |
55 | ir_maps->self_comp); | |
3b34b490 FD |
56 | if (status != DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK) { |
57 | BT_COMP_LOGE_APPEND_CAUSE(self_comp, | |
58 | "Error copy content to output trace class" | |
59 | "in-tc-addr=%p, out-tc-addr=%p", in_trace_class, | |
60 | metadata_maps->output_trace_class); | |
61 | goto error; | |
ca9f27f3 FD |
62 | } |
63 | ||
3b34b490 FD |
64 | BT_COMP_LOGD("Created new mapped trace class: " |
65 | "in-tc-addr=%p, out-tc-addr=%p", | |
db5d746d | 66 | in_trace_class, metadata_maps->output_trace_class); |
ca9f27f3 | 67 | |
3b34b490 FD |
68 | goto end; |
69 | error: | |
70 | BT_TRACE_CLASS_PUT_REF_AND_RESET(metadata_maps->output_trace_class); | |
ca9f27f3 | 71 | end: |
db5d746d | 72 | return metadata_maps->output_trace_class; |
ca9f27f3 FD |
73 | } |
74 | ||
75 | static | |
76 | bt_trace *create_new_mapped_trace(struct trace_ir_maps *ir_maps, | |
77 | const bt_trace *in_trace) | |
78 | { | |
3b34b490 FD |
79 | bt_self_component *self_comp = ir_maps->self_comp; |
80 | enum debug_info_trace_ir_mapping_status status; | |
ca9f27f3 | 81 | struct trace_ir_metadata_maps *metadata_maps; |
8aca077e FD |
82 | const bt_trace_class *in_trace_class; |
83 | bt_trace *out_trace; | |
ca9f27f3 | 84 | |
91bc8451 | 85 | BT_COMP_LOGD("Creating new mapped trace: in-t-addr=%p", in_trace); |
ca9f27f3 FD |
86 | BT_ASSERT(ir_maps); |
87 | BT_ASSERT(in_trace); | |
88 | ||
89 | in_trace_class = bt_trace_borrow_class_const(in_trace); | |
90 | metadata_maps = borrow_metadata_maps_from_input_trace_class(ir_maps, | |
bc463d34 | 91 | in_trace_class); |
ca9f27f3 FD |
92 | |
93 | if (!metadata_maps->output_trace_class) { | |
8aca077e FD |
94 | /* |
95 | * If there is no output trace class yet, create a one and add | |
96 | * it to the mapping. | |
97 | */ | |
ca9f27f3 FD |
98 | metadata_maps->output_trace_class = |
99 | create_new_mapped_trace_class(ir_maps, in_trace_class); | |
100 | if (!metadata_maps->output_trace_class) { | |
3b34b490 FD |
101 | BT_COMP_LOGE_APPEND_CAUSE(self_comp, |
102 | "Error create output trace class"); | |
ca9f27f3 FD |
103 | out_trace = NULL; |
104 | goto end; | |
105 | } | |
106 | } | |
107 | ||
8aca077e | 108 | /* Create the output trace from the output trace class. */ |
ca9f27f3 FD |
109 | out_trace = bt_trace_create(metadata_maps->output_trace_class); |
110 | if (!out_trace) { | |
3b34b490 FD |
111 | BT_COMP_LOGE_APPEND_CAUSE(self_comp, |
112 | "Error create output trace"); | |
ca9f27f3 FD |
113 | goto end; |
114 | } | |
115 | ||
8aca077e | 116 | /* Copy the content over to the output trace. */ |
3b34b490 | 117 | status = copy_trace_content(in_trace, out_trace, ir_maps->log_level, |
91bc8451 | 118 | ir_maps->self_comp); |
3b34b490 FD |
119 | if (status != DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK) { |
120 | BT_COMP_LOGE_APPEND_CAUSE(self_comp, | |
121 | "Error copy content to output trace" | |
122 | "in-t-addr=%p, out-t-addr=%p", in_trace, out_trace); | |
123 | goto error; | |
124 | } | |
ca9f27f3 | 125 | |
91bc8451 | 126 | BT_COMP_LOGD("Created new mapped trace: in-t-addr=%p, out-t-addr=%p", |
bc463d34 | 127 | in_trace, out_trace); |
3b34b490 FD |
128 | goto end; |
129 | ||
130 | error: | |
131 | BT_TRACE_PUT_REF_AND_RESET(out_trace); | |
ca9f27f3 FD |
132 | end: |
133 | return out_trace; | |
134 | } | |
135 | ||
db5d746d FD |
136 | bt_stream_class *trace_ir_mapping_borrow_mapped_stream_class( |
137 | struct trace_ir_maps *ir_maps, | |
ca9f27f3 FD |
138 | const bt_stream_class *in_stream_class) |
139 | { | |
db5d746d | 140 | BT_ASSERT_DBG(ir_maps); |
98b15851 | 141 | BT_ASSERT_DBG(in_stream_class); |
ca9f27f3 | 142 | |
db5d746d FD |
143 | struct trace_ir_metadata_maps *md_maps = |
144 | borrow_metadata_maps_from_input_stream_class(ir_maps, | |
145 | in_stream_class); | |
ca9f27f3 | 146 | return g_hash_table_lookup(md_maps->stream_class_map, |
bc463d34 | 147 | (gpointer) in_stream_class); |
ca9f27f3 FD |
148 | } |
149 | ||
db5d746d FD |
150 | bt_stream_class *trace_ir_mapping_create_new_mapped_stream_class( |
151 | struct trace_ir_maps *ir_maps, | |
ca9f27f3 FD |
152 | const bt_stream_class *in_stream_class) |
153 | { | |
3b34b490 FD |
154 | bt_self_component *self_comp = ir_maps->self_comp; |
155 | enum debug_info_trace_ir_mapping_status status; | |
ca9f27f3 | 156 | struct trace_ir_metadata_maps *md_maps; |
8aca077e | 157 | bt_stream_class *out_stream_class; |
ca9f27f3 | 158 | |
91bc8451 | 159 | BT_COMP_LOGD("Creating new mapped stream class: in-sc-addr=%p", |
bc463d34 | 160 | in_stream_class); |
ca9f27f3 | 161 | |
8aca077e FD |
162 | BT_ASSERT(ir_maps); |
163 | BT_ASSERT(in_stream_class); | |
db5d746d FD |
164 | BT_ASSERT(!trace_ir_mapping_borrow_mapped_stream_class(ir_maps, |
165 | in_stream_class)); | |
8aca077e | 166 | |
ca9f27f3 | 167 | md_maps = borrow_metadata_maps_from_input_stream_class(ir_maps, |
bc463d34 | 168 | in_stream_class); |
ca9f27f3 FD |
169 | |
170 | BT_ASSERT(md_maps); | |
ca9f27f3 | 171 | |
8aca077e | 172 | /* Create the output stream class. */ |
ca9f27f3 | 173 | out_stream_class = bt_stream_class_create_with_id( |
bc463d34 FD |
174 | md_maps->output_trace_class, |
175 | bt_stream_class_get_id(in_stream_class)); | |
ca9f27f3 | 176 | if (!out_stream_class) { |
3b34b490 FD |
177 | BT_COMP_LOGE_APPEND_CAUSE(self_comp, |
178 | "Error create output stream class"); | |
ca9f27f3 FD |
179 | goto end; |
180 | } | |
181 | ||
3b34b490 | 182 | /* Add it to the mapping. The mapping now owns out_stream_class. */ |
db5d746d FD |
183 | g_hash_table_insert(md_maps->stream_class_map, |
184 | (gpointer) in_stream_class, out_stream_class); | |
185 | ||
8aca077e | 186 | /* Copy the content over to the output stream class. */ |
3b34b490 | 187 | status = copy_stream_class_content(ir_maps, in_stream_class, |
bc463d34 | 188 | out_stream_class); |
3b34b490 FD |
189 | if (status != DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK) { |
190 | BT_COMP_LOGE_APPEND_CAUSE(self_comp, | |
191 | "Error copy content to output stream class: " | |
192 | "in-sc-addr=%p, out-sc-addr=%p", in_stream_class, | |
193 | out_stream_class); | |
194 | goto error; | |
ca9f27f3 FD |
195 | } |
196 | ||
3b34b490 FD |
197 | BT_COMP_LOGD("Created new mapped stream class: " |
198 | "in-sc-addr=%p, out-sc-addr=%p", | |
bc463d34 | 199 | in_stream_class, out_stream_class); |
ca9f27f3 | 200 | |
3b34b490 FD |
201 | goto end; |
202 | error: | |
203 | out_stream_class = NULL; | |
ca9f27f3 FD |
204 | end: |
205 | return out_stream_class; | |
206 | } | |
207 | ||
208 | static | |
209 | bt_stream *borrow_mapped_stream(struct trace_ir_data_maps *d_maps, | |
210 | const bt_stream *in_stream) | |
211 | { | |
98b15851 PP |
212 | BT_ASSERT_DBG(d_maps); |
213 | BT_ASSERT_DBG(in_stream); | |
ca9f27f3 FD |
214 | |
215 | return g_hash_table_lookup(d_maps->stream_map, (gpointer) in_stream); | |
216 | } | |
217 | ||
ca9f27f3 | 218 | bt_stream *trace_ir_mapping_create_new_mapped_stream( |
8aca077e | 219 | struct trace_ir_maps *ir_maps, const bt_stream *in_stream) |
ca9f27f3 | 220 | { |
3b34b490 FD |
221 | bt_self_component *self_comp = ir_maps->self_comp; |
222 | enum debug_info_trace_ir_mapping_status status; | |
ca9f27f3 | 223 | struct trace_ir_data_maps *d_maps; |
ca9f27f3 FD |
224 | const bt_stream_class *in_stream_class; |
225 | const bt_trace *in_trace; | |
226 | bt_stream_class *out_stream_class; | |
227 | bt_stream *out_stream = NULL; | |
228 | ||
ca9f27f3 FD |
229 | BT_ASSERT(ir_maps); |
230 | BT_ASSERT(in_stream); | |
91bc8451 | 231 | BT_COMP_LOGD("Creating new mapped stream: in-s-addr=%p", in_stream); |
ca9f27f3 FD |
232 | |
233 | in_trace = bt_stream_borrow_trace_const(in_stream); | |
234 | ||
235 | d_maps = borrow_data_maps_from_input_trace(ir_maps, in_trace); | |
236 | if (!d_maps->output_trace) { | |
8aca077e | 237 | /* Create the output trace for this input trace. */ |
ca9f27f3 FD |
238 | d_maps->output_trace = create_new_mapped_trace(ir_maps, in_trace); |
239 | if (!d_maps->output_trace) { | |
3b34b490 FD |
240 | BT_COMP_LOGE_APPEND_CAUSE(self_comp, |
241 | "Error creating mapped trace"); | |
242 | goto error; | |
ca9f27f3 FD |
243 | } |
244 | } | |
245 | ||
246 | BT_ASSERT(d_maps->output_trace); | |
247 | BT_ASSERT(!borrow_mapped_stream(d_maps, in_stream)); | |
248 | ||
249 | in_stream_class = bt_stream_borrow_class_const(in_stream); | |
db5d746d FD |
250 | out_stream_class = trace_ir_mapping_borrow_mapped_stream_class(ir_maps, |
251 | in_stream_class); | |
252 | ||
ca9f27f3 | 253 | if (!out_stream_class) { |
8aca077e | 254 | /* Create the output stream class for this input stream class. */ |
db5d746d FD |
255 | out_stream_class = trace_ir_mapping_create_new_mapped_stream_class( |
256 | ir_maps, in_stream_class); | |
ca9f27f3 | 257 | if (!out_stream_class) { |
3b34b490 FD |
258 | BT_COMP_LOGE_APPEND_CAUSE(self_comp, |
259 | "Error creating mapped stream class"); | |
260 | goto error; | |
ca9f27f3 FD |
261 | } |
262 | } | |
263 | BT_ASSERT(out_stream_class); | |
264 | ||
8aca077e | 265 | /* Create the output stream for this input stream. */ |
ca9f27f3 | 266 | out_stream = bt_stream_create_with_id(out_stream_class, |
8aca077e | 267 | d_maps->output_trace, bt_stream_get_id(in_stream)); |
ca9f27f3 | 268 | if (!out_stream) { |
3b34b490 FD |
269 | BT_COMP_LOGE_APPEND_CAUSE(self_comp, |
270 | "Error creating output stream"); | |
271 | goto error; | |
ca9f27f3 | 272 | } |
ca9f27f3 | 273 | |
3b34b490 | 274 | /* Add it to the mapping. The mapping now owns out_stream.*/ |
ca9f27f3 | 275 | g_hash_table_insert(d_maps->stream_map, (gpointer) in_stream, |
bc463d34 | 276 | out_stream); |
ca9f27f3 | 277 | |
db5d746d | 278 | /* Copy the content over to the output stream. */ |
3b34b490 | 279 | status = copy_stream_content(in_stream, out_stream, ir_maps->log_level, |
db5d746d | 280 | ir_maps->self_comp); |
3b34b490 FD |
281 | if (status != DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK) { |
282 | BT_COMP_LOGE_APPEND_CAUSE(self_comp, | |
283 | "Error copy content to output stream: " | |
284 | "in-s-addr=%p, out-s-addr=%p", in_stream, out_stream); | |
285 | goto error; | |
286 | } | |
db5d746d | 287 | |
91bc8451 | 288 | BT_COMP_LOGD("Created new mapped stream: in-s-addr=%p, out-s-addr=%p", |
bc463d34 | 289 | in_stream, out_stream); |
ca9f27f3 | 290 | |
3b34b490 FD |
291 | goto end; |
292 | error: | |
293 | out_stream = NULL; | |
ca9f27f3 FD |
294 | end: |
295 | return out_stream; | |
296 | } | |
297 | ||
ca9f27f3 FD |
298 | bt_stream *trace_ir_mapping_borrow_mapped_stream(struct trace_ir_maps *ir_maps, |
299 | const bt_stream *in_stream) | |
300 | { | |
8aca077e FD |
301 | struct trace_ir_data_maps *d_maps; |
302 | ||
98b15851 PP |
303 | BT_ASSERT_DBG(ir_maps); |
304 | BT_ASSERT_DBG(in_stream); | |
ca9f27f3 FD |
305 | |
306 | d_maps = borrow_data_maps_from_input_stream(ir_maps, in_stream); | |
307 | /* Return the mapped stream. */ | |
308 | return borrow_mapped_stream(d_maps, in_stream); | |
309 | } | |
310 | ||
311 | static inline | |
312 | bt_event_class *borrow_mapped_event_class(struct trace_ir_metadata_maps *md_maps, | |
313 | const bt_event_class *in_event_class) | |
314 | { | |
315 | return g_hash_table_lookup(md_maps->event_class_map, | |
bc463d34 | 316 | (gpointer) in_event_class); |
ca9f27f3 FD |
317 | } |
318 | ||
ca9f27f3 FD |
319 | bt_event_class *trace_ir_mapping_create_new_mapped_event_class( |
320 | struct trace_ir_maps *ir_maps, | |
321 | const bt_event_class *in_event_class) | |
322 | { | |
3b34b490 FD |
323 | bt_self_component *self_comp = ir_maps->self_comp; |
324 | enum debug_info_trace_ir_mapping_status status; | |
8aca077e | 325 | struct trace_ir_metadata_maps *md_maps; |
ca9f27f3 FD |
326 | const bt_stream_class *in_stream_class; |
327 | bt_stream_class *out_stream_class; | |
8aca077e | 328 | bt_event_class *out_event_class; |
ca9f27f3 | 329 | |
8aca077e FD |
330 | BT_COMP_LOGD("Creating new mapped event class: in-ec-addr=%p", |
331 | in_event_class); | |
332 | ||
ca9f27f3 FD |
333 | BT_ASSERT(ir_maps); |
334 | BT_ASSERT(in_event_class); | |
335 | ||
8aca077e | 336 | in_stream_class = bt_event_class_borrow_stream_class_const(in_event_class); |
ca9f27f3 | 337 | |
8aca077e | 338 | BT_ASSERT(in_stream_class); |
ca9f27f3 | 339 | |
8aca077e FD |
340 | md_maps = borrow_metadata_maps_from_input_stream_class(ir_maps, |
341 | in_stream_class); | |
ca9f27f3 | 342 | |
8aca077e FD |
343 | BT_ASSERT(md_maps); |
344 | BT_ASSERT(!borrow_mapped_event_class(md_maps, in_event_class)); | |
ca9f27f3 | 345 | |
8aca077e | 346 | /* Get the right output stream class to add the new event class to it. */ |
db5d746d FD |
347 | out_stream_class = trace_ir_mapping_borrow_mapped_stream_class( |
348 | ir_maps, in_stream_class); | |
ca9f27f3 FD |
349 | BT_ASSERT(out_stream_class); |
350 | ||
351 | /* Create an output event class. */ | |
352 | out_event_class = bt_event_class_create_with_id(out_stream_class, | |
bc463d34 | 353 | bt_event_class_get_id(in_event_class)); |
ca9f27f3 | 354 | if (!out_event_class) { |
3b34b490 FD |
355 | BT_COMP_LOGE_APPEND_CAUSE(self_comp, |
356 | "Error creating output event class"); | |
ca9f27f3 FD |
357 | goto end; |
358 | } | |
359 | ||
3b34b490 FD |
360 | /* Add it to the mapping. The mapping now owns out_event_class. */ |
361 | g_hash_table_insert(md_maps->event_class_map, (gpointer) in_event_class, | |
362 | out_event_class); | |
db5d746d | 363 | |
8aca077e | 364 | /* Copy the content over to the output event class. */ |
3b34b490 | 365 | status = copy_event_class_content(ir_maps, in_event_class, |
bc463d34 | 366 | out_event_class); |
3b34b490 FD |
367 | if (status != DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK) { |
368 | BT_COMP_LOGE_APPEND_CAUSE(self_comp, | |
369 | "Error copy content to output event class: " | |
370 | "in-ec-addr=%p, out-ec-addr=%p", in_event_class, | |
371 | out_event_class); | |
372 | goto error; | |
ca9f27f3 FD |
373 | } |
374 | ||
91bc8451 | 375 | BT_COMP_LOGD("Created new mapped event class: in-ec-addr=%p, out-ec-addr=%p", |
bc463d34 | 376 | in_event_class, out_event_class); |
ca9f27f3 | 377 | |
3b34b490 FD |
378 | goto end; |
379 | error: | |
380 | out_event_class = NULL; | |
ca9f27f3 FD |
381 | end: |
382 | return out_event_class; | |
383 | } | |
384 | ||
ca9f27f3 FD |
385 | bt_event_class *trace_ir_mapping_borrow_mapped_event_class( |
386 | struct trace_ir_maps *ir_maps, | |
387 | const bt_event_class *in_event_class) | |
388 | { | |
389 | struct trace_ir_metadata_maps *md_maps; | |
390 | ||
98b15851 PP |
391 | BT_ASSERT_DBG(ir_maps); |
392 | BT_ASSERT_DBG(in_event_class); | |
ca9f27f3 | 393 | |
bc463d34 FD |
394 | md_maps = borrow_metadata_maps_from_input_event_class(ir_maps, |
395 | in_event_class); | |
ca9f27f3 FD |
396 | |
397 | /* Return the mapped event_class. */ | |
398 | return borrow_mapped_event_class(md_maps, in_event_class); | |
399 | } | |
400 | ||
401 | static inline | |
402 | bt_packet *borrow_mapped_packet(struct trace_ir_data_maps *d_maps, | |
403 | const bt_packet *in_packet) | |
404 | { | |
98b15851 PP |
405 | BT_ASSERT_DBG(d_maps); |
406 | BT_ASSERT_DBG(in_packet); | |
ca9f27f3 | 407 | |
bc463d34 | 408 | return g_hash_table_lookup(d_maps->packet_map, (gpointer) in_packet); |
ca9f27f3 FD |
409 | } |
410 | ||
ca9f27f3 FD |
411 | bt_packet *trace_ir_mapping_create_new_mapped_packet( |
412 | struct trace_ir_maps *ir_maps, | |
413 | const bt_packet *in_packet) | |
414 | { | |
3b34b490 FD |
415 | bt_self_component *self_comp = ir_maps->self_comp; |
416 | enum debug_info_trace_ir_mapping_status status; | |
ca9f27f3 | 417 | struct trace_ir_data_maps *d_maps; |
ca9f27f3 | 418 | const bt_stream *in_stream; |
8aca077e | 419 | const bt_trace *in_trace; |
ca9f27f3 FD |
420 | bt_packet *out_packet; |
421 | bt_stream *out_stream; | |
422 | ||
91bc8451 | 423 | BT_COMP_LOGD("Creating new mapped packet: in-p-addr=%p", in_packet); |
ca9f27f3 FD |
424 | |
425 | in_stream = bt_packet_borrow_stream_const(in_packet); | |
426 | in_trace = bt_stream_borrow_trace_const(in_stream); | |
427 | d_maps = borrow_data_maps_from_input_trace(ir_maps, in_trace); | |
428 | ||
8aca077e | 429 | /* There should never be a mapped packet already. */ |
ca9f27f3 | 430 | BT_ASSERT(!borrow_mapped_packet(d_maps, in_packet)); |
ca9f27f3 FD |
431 | BT_ASSERT(in_stream); |
432 | ||
433 | /* Get output stream corresponding to this input stream. */ | |
434 | out_stream = borrow_mapped_stream(d_maps, in_stream); | |
435 | BT_ASSERT(out_stream); | |
436 | ||
437 | /* Create the output packet. */ | |
438 | out_packet = bt_packet_create(out_stream); | |
439 | if (!out_packet) { | |
3b34b490 FD |
440 | BT_COMP_LOGE_APPEND_CAUSE(self_comp, |
441 | "Error create output packet"); | |
442 | goto error; | |
ca9f27f3 FD |
443 | } |
444 | ||
3b34b490 FD |
445 | /* Add it to the mapping. The mapping now owns out_packet. */ |
446 | g_hash_table_insert(d_maps->packet_map, (gpointer) in_packet, | |
447 | out_packet); | |
ca9f27f3 | 448 | |
db5d746d | 449 | /* Copy the content over to the output packet. */ |
3b34b490 | 450 | status = copy_packet_content(in_packet, out_packet, ir_maps->log_level, |
db5d746d | 451 | ir_maps->self_comp); |
3b34b490 FD |
452 | if (status != DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK) { |
453 | BT_COMP_LOGE_APPEND_CAUSE(self_comp, | |
454 | "Error copy content to output packet: " | |
455 | "in-p-addr=%p, out-p-addr=%p", in_packet, out_packet); | |
456 | goto error; | |
457 | } | |
db5d746d | 458 | |
91bc8451 | 459 | BT_COMP_LOGD("Created new mapped packet: in-p-addr=%p, out-p-addr=%p", |
bc463d34 | 460 | in_packet, out_packet); |
ca9f27f3 | 461 | |
3b34b490 FD |
462 | goto end; |
463 | error: | |
464 | out_packet = NULL; | |
ca9f27f3 FD |
465 | end: |
466 | return out_packet; | |
467 | } | |
468 | ||
ca9f27f3 FD |
469 | bt_packet *trace_ir_mapping_borrow_mapped_packet(struct trace_ir_maps *ir_maps, |
470 | const bt_packet *in_packet) | |
471 | { | |
472 | struct trace_ir_data_maps *d_maps; | |
98b15851 PP |
473 | BT_ASSERT_DBG(ir_maps); |
474 | BT_ASSERT_DBG(in_packet); | |
ca9f27f3 FD |
475 | |
476 | d_maps = borrow_data_maps_from_input_packet(ir_maps, in_packet); | |
477 | ||
478 | return borrow_mapped_packet(d_maps, in_packet); | |
479 | } | |
480 | ||
ca9f27f3 FD |
481 | void trace_ir_mapping_remove_mapped_packet(struct trace_ir_maps *ir_maps, |
482 | const bt_packet *in_packet) | |
483 | { | |
8aca077e | 484 | struct trace_ir_data_maps *d_maps; |
ca9f27f3 FD |
485 | gboolean ret; |
486 | ||
ca9f27f3 FD |
487 | BT_ASSERT(ir_maps); |
488 | BT_ASSERT(in_packet); | |
489 | ||
490 | d_maps = borrow_data_maps_from_input_packet(ir_maps, in_packet); | |
491 | ||
492 | ret = g_hash_table_remove(d_maps->packet_map, in_packet); | |
493 | ||
494 | BT_ASSERT(ret); | |
495 | } | |
496 | ||
ca9f27f3 FD |
497 | void trace_ir_mapping_remove_mapped_stream(struct trace_ir_maps *ir_maps, |
498 | const bt_stream *in_stream) | |
499 | { | |
ca9f27f3 | 500 | struct trace_ir_data_maps *d_maps; |
8aca077e | 501 | gboolean ret; |
ca9f27f3 FD |
502 | |
503 | BT_ASSERT(ir_maps); | |
504 | BT_ASSERT(in_stream); | |
505 | ||
506 | d_maps = borrow_data_maps_from_input_stream(ir_maps, in_stream); | |
507 | ||
508 | ret = g_hash_table_remove(d_maps->stream_map, in_stream); | |
509 | ||
510 | BT_ASSERT(ret); | |
511 | } | |
512 | ||
513 | static | |
514 | void trace_ir_metadata_maps_remove_func(const bt_trace_class *in_trace_class, | |
515 | void *data) | |
516 | { | |
517 | struct trace_ir_maps *maps = (struct trace_ir_maps *) data; | |
518 | if (maps->metadata_maps) { | |
519 | gboolean ret; | |
520 | ret = g_hash_table_remove(maps->metadata_maps, | |
bc463d34 | 521 | (gpointer) in_trace_class); |
ca9f27f3 FD |
522 | BT_ASSERT(ret); |
523 | } | |
524 | } | |
525 | ||
526 | static | |
527 | void trace_ir_data_maps_remove_func(const bt_trace *in_trace, void *data) | |
528 | { | |
529 | struct trace_ir_maps *maps = (struct trace_ir_maps *) data; | |
530 | if (maps->data_maps) { | |
531 | gboolean ret; | |
532 | ret = g_hash_table_remove(maps->data_maps, (gpointer) in_trace); | |
533 | BT_ASSERT(ret); | |
534 | } | |
535 | } | |
536 | ||
537 | struct trace_ir_data_maps *trace_ir_data_maps_create(struct trace_ir_maps *ir_maps, | |
538 | const bt_trace *in_trace) | |
539 | { | |
3b34b490 | 540 | bt_self_component *self_comp = ir_maps->self_comp; |
b80991f6 | 541 | bt_trace_add_listener_status add_listener_status; |
8aca077e | 542 | struct trace_ir_data_maps *d_maps = g_new0(struct trace_ir_data_maps, 1); |
b80991f6 | 543 | |
ca9f27f3 | 544 | if (!d_maps) { |
3b34b490 FD |
545 | BT_COMP_LOGE_APPEND_CAUSE(self_comp, |
546 | "Error allocating trace_ir_maps"); | |
ca9f27f3 FD |
547 | goto error; |
548 | } | |
549 | ||
3a3d15f3 | 550 | d_maps->log_level = ir_maps->log_level; |
91bc8451 | 551 | d_maps->self_comp = ir_maps->self_comp; |
ca9f27f3 FD |
552 | d_maps->input_trace = in_trace; |
553 | ||
554 | /* Create the hashtables used to map data objects. */ | |
555 | d_maps->stream_map = g_hash_table_new_full(g_direct_hash, | |
8aca077e | 556 | g_direct_equal, NULL,(GDestroyNotify) bt_stream_put_ref); |
ca9f27f3 | 557 | d_maps->packet_map = g_hash_table_new_full(g_direct_hash, |
8aca077e | 558 | g_direct_equal, NULL,(GDestroyNotify) bt_packet_put_ref); |
ca9f27f3 | 559 | |
b80991f6 PP |
560 | add_listener_status = bt_trace_add_destruction_listener( |
561 | in_trace, trace_ir_data_maps_remove_func, | |
562 | ir_maps, &d_maps->destruction_listener_id); | |
563 | BT_ASSERT(add_listener_status == BT_TRACE_ADD_LISTENER_STATUS_OK); | |
564 | ||
ca9f27f3 FD |
565 | error: |
566 | return d_maps; | |
567 | } | |
568 | ||
569 | struct trace_ir_metadata_maps *trace_ir_metadata_maps_create( | |
570 | struct trace_ir_maps *ir_maps, | |
571 | const bt_trace_class *in_trace_class) | |
572 | { | |
3b34b490 | 573 | bt_self_component *self_comp = ir_maps->self_comp; |
8aca077e | 574 | bt_trace_class_add_listener_status add_listener_status; |
ca9f27f3 FD |
575 | struct trace_ir_metadata_maps *md_maps = |
576 | g_new0(struct trace_ir_metadata_maps, 1); | |
b80991f6 | 577 | |
ca9f27f3 | 578 | if (!md_maps) { |
3b34b490 FD |
579 | BT_COMP_LOGE_APPEND_CAUSE(self_comp, |
580 | "Error allocating trace_ir_maps"); | |
ca9f27f3 FD |
581 | goto error; |
582 | } | |
583 | ||
3a3d15f3 | 584 | md_maps->log_level = ir_maps->log_level; |
91bc8451 | 585 | md_maps->self_comp = ir_maps->self_comp; |
ca9f27f3 FD |
586 | md_maps->input_trace_class = in_trace_class; |
587 | /* | |
588 | * Create the field class resolving context. This is needed to keep | |
589 | * track of the field class already copied in order to do the field | |
590 | * path resolution correctly. | |
591 | */ | |
592 | md_maps->fc_resolving_ctx = | |
593 | g_new0(struct field_class_resolving_context, 1); | |
594 | if (!md_maps->fc_resolving_ctx) { | |
3b34b490 FD |
595 | BT_COMP_LOGE_APPEND_CAUSE(self_comp, |
596 | "Error allocating field_class_resolving_context"); | |
ca9f27f3 FD |
597 | goto error; |
598 | } | |
599 | ||
600 | /* Create the hashtables used to map metadata objects. */ | |
601 | md_maps->stream_class_map = g_hash_table_new_full(g_direct_hash, | |
bc463d34 | 602 | g_direct_equal, NULL, (GDestroyNotify) bt_stream_class_put_ref); |
ca9f27f3 | 603 | md_maps->event_class_map = g_hash_table_new_full(g_direct_hash, |
bc463d34 | 604 | g_direct_equal, NULL, (GDestroyNotify) bt_event_class_put_ref); |
ca9f27f3 | 605 | md_maps->field_class_map = g_hash_table_new_full(g_direct_hash, |
bc463d34 | 606 | g_direct_equal, NULL, (GDestroyNotify) bt_field_class_put_ref); |
ca9f27f3 | 607 | md_maps->clock_class_map = g_hash_table_new_full(g_direct_hash, |
bc463d34 | 608 | g_direct_equal, NULL, (GDestroyNotify) bt_clock_class_put_ref); |
ca9f27f3 | 609 | |
b80991f6 | 610 | add_listener_status = bt_trace_class_add_destruction_listener( |
bc463d34 FD |
611 | in_trace_class, trace_ir_metadata_maps_remove_func, |
612 | ir_maps, &md_maps->destruction_listener_id); | |
613 | BT_ASSERT(add_listener_status == BT_TRACE_CLASS_ADD_LISTENER_STATUS_OK); | |
b80991f6 | 614 | |
ca9f27f3 FD |
615 | error: |
616 | return md_maps; | |
617 | } | |
618 | ||
ca9f27f3 FD |
619 | void trace_ir_data_maps_destroy(struct trace_ir_data_maps *maps) |
620 | { | |
d24d5663 PP |
621 | bt_trace_remove_listener_status status; |
622 | ||
ca9f27f3 FD |
623 | if (!maps) { |
624 | return; | |
625 | } | |
626 | ||
627 | if (maps->packet_map) { | |
628 | g_hash_table_destroy(maps->packet_map); | |
629 | } | |
630 | ||
631 | if (maps->stream_map) { | |
632 | g_hash_table_destroy(maps->stream_map); | |
633 | } | |
634 | ||
635 | if (maps->output_trace) { | |
636 | bt_trace_put_ref(maps->output_trace); | |
637 | } | |
638 | ||
639 | status = bt_trace_remove_destruction_listener(maps->input_trace, | |
d24d5663 PP |
640 | maps->destruction_listener_id); |
641 | if (status != BT_TRACE_REMOVE_LISTENER_STATUS_OK) { | |
91bc8451 PP |
642 | BT_COMP_LOG_CUR_LVL(BT_LOG_DEBUG, maps->log_level, |
643 | maps->self_comp, | |
3a3d15f3 | 644 | "Trace destruction listener removal failed."); |
b80991f6 | 645 | bt_current_thread_clear_error(); |
3b40fbf9 | 646 | } |
ca9f27f3 FD |
647 | |
648 | g_free(maps); | |
649 | } | |
650 | ||
ca9f27f3 FD |
651 | void trace_ir_metadata_maps_destroy(struct trace_ir_metadata_maps *maps) |
652 | { | |
d24d5663 PP |
653 | bt_trace_class_remove_listener_status status; |
654 | ||
ca9f27f3 FD |
655 | if (!maps) { |
656 | return; | |
657 | } | |
658 | ||
659 | if (maps->stream_class_map) { | |
660 | g_hash_table_destroy(maps->stream_class_map); | |
661 | } | |
662 | ||
663 | if (maps->event_class_map) { | |
664 | g_hash_table_destroy(maps->event_class_map); | |
665 | } | |
666 | ||
667 | if (maps->field_class_map) { | |
668 | g_hash_table_destroy(maps->field_class_map); | |
669 | } | |
670 | ||
671 | if (maps->clock_class_map) { | |
672 | g_hash_table_destroy(maps->clock_class_map); | |
673 | } | |
674 | ||
19bbdc9b | 675 | g_free(maps->fc_resolving_ctx); |
ca9f27f3 FD |
676 | |
677 | if (maps->output_trace_class) { | |
678 | bt_trace_class_put_ref(maps->output_trace_class); | |
679 | } | |
680 | ||
d24d5663 | 681 | status = bt_trace_class_remove_destruction_listener( |
bc463d34 | 682 | maps->input_trace_class, maps->destruction_listener_id); |
d24d5663 | 683 | if (status != BT_TRACE_CLASS_REMOVE_LISTENER_STATUS_OK) { |
91bc8451 PP |
684 | BT_COMP_LOG_CUR_LVL(BT_LOG_DEBUG, maps->log_level, |
685 | maps->self_comp, | |
3a3d15f3 | 686 | "Trace destruction listener removal failed."); |
b80991f6 | 687 | bt_current_thread_clear_error(); |
3b40fbf9 | 688 | } |
ca9f27f3 FD |
689 | |
690 | g_free(maps); | |
691 | } | |
692 | ||
693 | void trace_ir_maps_clear(struct trace_ir_maps *maps) | |
694 | { | |
695 | if (maps->data_maps) { | |
696 | g_hash_table_remove_all(maps->data_maps); | |
697 | } | |
698 | ||
699 | if (maps->metadata_maps) { | |
700 | g_hash_table_remove_all(maps->metadata_maps); | |
701 | } | |
702 | } | |
703 | ||
ca9f27f3 FD |
704 | void trace_ir_maps_destroy(struct trace_ir_maps *maps) |
705 | { | |
706 | if (!maps) { | |
707 | return; | |
708 | } | |
709 | ||
19bbdc9b | 710 | g_free(maps->debug_info_field_class_name); |
ca9f27f3 FD |
711 | |
712 | if (maps->data_maps) { | |
713 | g_hash_table_destroy(maps->data_maps); | |
714 | maps->data_maps = NULL; | |
715 | } | |
716 | ||
717 | if (maps->metadata_maps) { | |
718 | g_hash_table_destroy(maps->metadata_maps); | |
719 | maps->metadata_maps = NULL; | |
720 | } | |
721 | ||
722 | g_free(maps); | |
723 | } | |
724 | ||
ca9f27f3 | 725 | struct trace_ir_maps *trace_ir_maps_create(bt_self_component *self_comp, |
3a3d15f3 | 726 | const char *debug_info_field_name, bt_logging_level log_level) |
ca9f27f3 | 727 | { |
8aca077e | 728 | struct trace_ir_maps *ir_maps = g_new0(struct trace_ir_maps, 1); |
3a3d15f3 | 729 | if (!ir_maps) { |
91bc8451 | 730 | BT_COMP_LOG_CUR_LVL(BT_LOG_ERROR, log_level, self_comp, |
3a3d15f3 | 731 | "Error allocating trace_ir_maps"); |
ca9f27f3 FD |
732 | goto error; |
733 | } | |
734 | ||
3a3d15f3 | 735 | ir_maps->log_level = log_level; |
91bc8451 | 736 | ir_maps->self_comp = self_comp; |
3a3d15f3 | 737 | |
ca9f27f3 | 738 | /* Copy debug info field name received from the user. */ |
8aca077e | 739 | ir_maps->debug_info_field_class_name = g_strdup(debug_info_field_name); |
3a3d15f3 | 740 | if (!ir_maps->debug_info_field_class_name) { |
3b34b490 FD |
741 | BT_COMP_LOGE_APPEND_CAUSE(self_comp, |
742 | "Cannot copy debug info field name"); | |
ca9f27f3 FD |
743 | goto error; |
744 | } | |
745 | ||
3a3d15f3 | 746 | ir_maps->self_comp = self_comp; |
ca9f27f3 | 747 | |
3a3d15f3 | 748 | ir_maps->data_maps = g_hash_table_new_full(g_direct_hash, |
bc463d34 FD |
749 | g_direct_equal, (GDestroyNotify) NULL, |
750 | (GDestroyNotify) trace_ir_data_maps_destroy); | |
ca9f27f3 | 751 | |
3a3d15f3 | 752 | ir_maps->metadata_maps = g_hash_table_new_full(g_direct_hash, |
bc463d34 FD |
753 | g_direct_equal, (GDestroyNotify) NULL, |
754 | (GDestroyNotify) trace_ir_metadata_maps_destroy); | |
ca9f27f3 FD |
755 | |
756 | goto end; | |
757 | error: | |
3a3d15f3 PP |
758 | trace_ir_maps_destroy(ir_maps); |
759 | ir_maps = NULL; | |
ca9f27f3 | 760 | end: |
3a3d15f3 | 761 | return ir_maps; |
ca9f27f3 | 762 | } |