cpp-common/bt2c/fmt.hpp: use `wise_enum::string_type` in `EnableIfIsWiseEnum` definition
[babeltrace.git] / src / plugins / lttng-utils / debug-info / trace-ir-mapping.c
CommitLineData
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
25static
26bt_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;
69error:
70 BT_TRACE_CLASS_PUT_REF_AND_RESET(metadata_maps->output_trace_class);
ca9f27f3 71end:
db5d746d 72 return metadata_maps->output_trace_class;
ca9f27f3
FD
73}
74
75static
76bt_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
130error:
131 BT_TRACE_PUT_REF_AND_RESET(out_trace);
ca9f27f3
FD
132end:
133 return out_trace;
134}
135
db5d746d
FD
136bt_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
150bt_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;
202error:
203 out_stream_class = NULL;
ca9f27f3
FD
204end:
205 return out_stream_class;
206}
207
208static
209bt_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 218bt_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;
292error:
293 out_stream = NULL;
ca9f27f3
FD
294end:
295 return out_stream;
296}
297
ca9f27f3
FD
298bt_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
311static inline
312bt_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
319bt_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;
379error:
380 out_event_class = NULL;
ca9f27f3
FD
381end:
382 return out_event_class;
383}
384
ca9f27f3
FD
385bt_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
401static inline
402bt_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
411bt_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;
463error:
464 out_packet = NULL;
ca9f27f3
FD
465end:
466 return out_packet;
467}
468
ca9f27f3
FD
469bt_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
481void 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
497void 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
513static
514void 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
526static
527void 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
537struct 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
565error:
566 return d_maps;
567}
568
569struct 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
615error:
616 return md_maps;
617}
618
ca9f27f3
FD
619void 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
651void 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
693void 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
704void 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 725struct 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;
757error:
3a3d15f3
PP
758 trace_ir_maps_destroy(ir_maps);
759 ir_maps = NULL;
ca9f27f3 760end:
3a3d15f3 761 return ir_maps;
ca9f27f3 762}
This page took 0.116691 seconds and 4 git commands to generate.