Move to kernel style SPDX license identifiers
[babeltrace.git] / src / plugins / lttng-utils / debug-info / trace-ir-metadata-copy.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 8 * Babeltrace - Trace IR metadata object copy
ca9f27f3
FD
9 */
10
91bc8451 11#define BT_COMP_LOG_SELF_COMP self_comp
3a3d15f3 12#define BT_LOG_OUTPUT_LEVEL log_level
350ad6c1 13#define BT_LOG_TAG "PLUGIN/FLT.LTTNG-UTILS.DEBUG-INFO/TRACE-IR-META-COPY"
d9c39b0a 14#include "logging/comp-logging.h"
ca9f27f3
FD
15
16#include <inttypes.h>
17#include <stdint.h>
18
578e048b 19#include "common/assert.h"
ca9f27f3
FD
20
21#include "trace-ir-metadata-copy.h"
22#include "trace-ir-metadata-field-class-copy.h"
23#include "utils.h"
24
25BT_HIDDEN
3b34b490
FD
26enum debug_info_trace_ir_mapping_status copy_trace_class_content(
27 struct trace_ir_maps *ir_maps,
28 const bt_trace_class *in_trace_class,
29 bt_trace_class *out_trace_class,
db5d746d 30 bt_logging_level log_level, bt_self_component *self_comp)
ca9f27f3 31{
3b34b490 32 enum debug_info_trace_ir_mapping_status status;
db5d746d 33 uint64_t sc_number, sc_idx;
3b34b490 34
91bc8451 35 BT_COMP_LOGD("Copying content of trace class: in-tc-addr=%p, out-tc-addr=%p",
bc463d34 36 in_trace_class, out_trace_class);
ca9f27f3 37
ce45f74a
PP
38 /*
39 * Safe to use the same value object because it's frozen at this
40 * point.
41 */
42 bt_trace_class_set_user_attributes(out_trace_class,
43 bt_trace_class_borrow_user_attributes_const(in_trace_class));
44
ca9f27f3
FD
45 /* Use the same stream class ids as in the origin trace class. */
46 bt_trace_class_set_assigns_automatic_stream_class_id(out_trace_class,
bc463d34 47 BT_FALSE);
db5d746d
FD
48
49 /* Copy stream classes contained in the trace class. */
50 sc_number = bt_trace_class_get_stream_class_count(in_trace_class);
51 for (sc_idx = 0; sc_idx < sc_number; sc_idx++) {
52 bt_stream_class *out_stream_class;
53 const bt_stream_class *in_stream_class =
54 bt_trace_class_borrow_stream_class_by_index_const(
55 in_trace_class, sc_idx);
56
57 out_stream_class = trace_ir_mapping_borrow_mapped_stream_class(
58 ir_maps, in_stream_class);
59 if (!out_stream_class) {
3b34b490 60 out_stream_class = trace_ir_mapping_create_new_mapped_stream_class(
db5d746d 61 ir_maps, in_stream_class);
3b34b490
FD
62 if (!out_stream_class) {
63 status = DEBUG_INFO_TRACE_IR_MAPPING_STATUS_MEMORY_ERROR;
64 goto end;
65 }
db5d746d
FD
66 }
67 }
68
91bc8451 69 BT_COMP_LOGD("Copied content of trace class: in-tc-addr=%p, out-tc-addr=%p",
bc463d34 70 in_trace_class, out_trace_class);
3b34b490
FD
71
72 status = DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK;
73end:
74 return status;
ca9f27f3
FD
75}
76
77static
3b34b490
FD
78enum debug_info_trace_ir_mapping_status copy_clock_class_content(
79 const bt_clock_class *in_clock_class,
91bc8451
PP
80 bt_clock_class *out_clock_class, bt_logging_level log_level,
81 bt_self_component *self_comp)
ca9f27f3 82{
3b34b490 83 enum debug_info_trace_ir_mapping_status status;
ca9f27f3
FD
84 const char *clock_class_name, *clock_class_description;
85 int64_t seconds;
86 uint64_t cycles;
87 bt_uuid in_uuid;
ca9f27f3 88
91bc8451 89 BT_COMP_LOGD("Copying content of clock class: in-cc-addr=%p, out-cc-addr=%p",
bc463d34 90 in_clock_class, out_clock_class);
ca9f27f3
FD
91
92 clock_class_name = bt_clock_class_get_name(in_clock_class);
93
94 if (clock_class_name) {
3b34b490
FD
95 enum bt_clock_class_set_name_status set_name_status =
96 bt_clock_class_set_name(out_clock_class, clock_class_name);
97 if (set_name_status != BT_CLOCK_CLASS_SET_NAME_STATUS_OK) {
98 BT_COMP_LOGE_APPEND_CAUSE(self_comp,
99 "Error setting clock class' name: "
100 "cc-addr=%p, name=%s", out_clock_class,
101 clock_class_name);
102 status = (int) set_name_status;
103 goto end;
ca9f27f3
FD
104 }
105 }
106
ce45f74a
PP
107 /*
108 * Safe to use the same value object because it's frozen at this
109 * point.
110 */
111 bt_clock_class_set_user_attributes(out_clock_class,
112 bt_clock_class_borrow_user_attributes_const(in_clock_class));
113
ca9f27f3
FD
114 clock_class_description = bt_clock_class_get_description(in_clock_class);
115
116 if (clock_class_description) {
3b34b490
FD
117 enum bt_clock_class_set_description_status set_desc_status =
118 bt_clock_class_set_description(out_clock_class, clock_class_description);
119 if (set_desc_status!= BT_CLOCK_CLASS_SET_DESCRIPTION_STATUS_OK) {
120 BT_COMP_LOGE_APPEND_CAUSE(self_comp,
121 "Error setting clock class' description: "
122 "cc-addr=%p, cc-desc=%s", out_clock_class,
123 clock_class_description);
124 status = (int) set_desc_status;
125 goto end;
ca9f27f3
FD
126 }
127 }
128
129 in_uuid = bt_clock_class_get_uuid(in_clock_class);
130 if (in_uuid) {
131 bt_clock_class_set_uuid(out_clock_class, in_uuid);
132 }
133
134 bt_clock_class_set_frequency(out_clock_class,
bc463d34 135 bt_clock_class_get_frequency(in_clock_class));
ca9f27f3 136 bt_clock_class_set_precision(out_clock_class,
bc463d34 137 bt_clock_class_get_precision(in_clock_class));
ca9f27f3
FD
138 bt_clock_class_get_offset(in_clock_class, &seconds, &cycles);
139 bt_clock_class_set_offset(out_clock_class, seconds, cycles);
140 bt_clock_class_set_origin_is_unix_epoch(out_clock_class,
bc463d34 141 bt_clock_class_origin_is_unix_epoch(in_clock_class));
ca9f27f3 142
91bc8451 143 BT_COMP_LOGD("Copied content of clock class: in-cc-addr=%p, out-cc-addr=%p",
bc463d34 144 in_clock_class, out_clock_class);
ca9f27f3 145
3b34b490
FD
146 status = DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK;
147end:
148 return status;
ca9f27f3
FD
149}
150
151static
152bt_clock_class *borrow_mapped_clock_class(
153 struct trace_ir_metadata_maps *md_maps,
154 const bt_clock_class *in_clock_class)
155{
98b15851
PP
156 BT_ASSERT_DBG(md_maps);
157 BT_ASSERT_DBG(in_clock_class);
ca9f27f3
FD
158
159 return g_hash_table_lookup(md_maps->clock_class_map,
bc463d34 160 (gpointer) in_clock_class);
ca9f27f3
FD
161}
162
163static
bc463d34 164bt_clock_class *create_new_mapped_clock_class(bt_self_component *self_comp,
ca9f27f3
FD
165 struct trace_ir_metadata_maps *md_maps,
166 const bt_clock_class *in_clock_class)
167{
3b34b490 168 enum debug_info_trace_ir_mapping_status status;
ca9f27f3 169 bt_clock_class *out_clock_class;
3a3d15f3 170 bt_logging_level log_level = md_maps->log_level;
ca9f27f3 171
91bc8451 172 BT_COMP_LOGD("Creating new mapped clock class: in-cc-addr=%p",
bc463d34 173 in_clock_class);
ca9f27f3
FD
174
175 BT_ASSERT(md_maps);
176 BT_ASSERT(in_clock_class);
177
178 BT_ASSERT(!borrow_mapped_clock_class(md_maps, in_clock_class));
179
180 out_clock_class = bt_clock_class_create(self_comp);
181 if (!out_clock_class) {
3b34b490
FD
182 BT_COMP_LOGE_APPEND_CAUSE(self_comp,
183 "Cannot create clock class");
ca9f27f3
FD
184 goto end;
185 }
186 /* If not, create a new one and add it to the mapping. */
3b34b490 187 status = copy_clock_class_content(in_clock_class, out_clock_class,
91bc8451 188 log_level, self_comp);
3b34b490
FD
189 if (status != DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK) {
190 BT_COMP_LOGE_APPEND_CAUSE(self_comp,
191 "Cannot copy clock class");
192 BT_CLOCK_CLASS_PUT_REF_AND_RESET(out_clock_class);
ca9f27f3
FD
193 goto end;
194 }
195
196 g_hash_table_insert(md_maps->clock_class_map,
bc463d34 197 (gpointer) in_clock_class, out_clock_class);
ca9f27f3 198
91bc8451 199 BT_COMP_LOGD("Created new mapped clock class: in-cc-addr=%p, out-cc-addr=%p",
bc463d34 200 in_clock_class, out_clock_class);
ca9f27f3
FD
201end:
202 return out_clock_class;
203}
204
205BT_HIDDEN
3b34b490
FD
206enum debug_info_trace_ir_mapping_status copy_stream_class_content(
207 struct trace_ir_maps *ir_maps,
ca9f27f3
FD
208 const bt_stream_class *in_stream_class,
209 bt_stream_class *out_stream_class)
210{
3b34b490 211 enum debug_info_trace_ir_mapping_status status;
ca9f27f3
FD
212 struct trace_ir_metadata_maps *md_maps;
213 const bt_clock_class *in_clock_class;
214 bt_clock_class *out_clock_class;
215 const bt_field_class *in_packet_context_fc, *in_common_context_fc;
216 bt_field_class *out_packet_context_fc, *out_common_context_fc;
ca9f27f3 217 const char *in_name;
db5d746d 218 uint64_t ec_number, ec_idx;
3a3d15f3 219 bt_logging_level log_level = ir_maps->log_level;
91bc8451 220 bt_self_component *self_comp = ir_maps->self_comp;
ca9f27f3 221
91bc8451 222 BT_COMP_LOGD("Copying content of stream class: in-sc-addr=%p, out-sc-addr=%p",
bc463d34 223 in_stream_class, out_stream_class);
ca9f27f3
FD
224
225 md_maps = borrow_metadata_maps_from_input_stream_class(ir_maps, in_stream_class);
226 in_clock_class = bt_stream_class_borrow_default_clock_class_const(
bc463d34 227 in_stream_class);
ca9f27f3
FD
228
229 if (in_clock_class) {
3b34b490 230 enum bt_stream_class_set_default_clock_class_status set_def_cc_status;
ca9f27f3 231 /* Copy the clock class. */
bc463d34
FD
232 out_clock_class = borrow_mapped_clock_class(md_maps,
233 in_clock_class);
ca9f27f3
FD
234 if (!out_clock_class) {
235 out_clock_class = create_new_mapped_clock_class(
bc463d34 236 ir_maps->self_comp, md_maps, in_clock_class);
3b34b490
FD
237 if (!out_clock_class) {
238 status = DEBUG_INFO_TRACE_IR_MAPPING_STATUS_MEMORY_ERROR;
239 goto end;
240 }
241 }
242 set_def_cc_status = bt_stream_class_set_default_clock_class(
243 out_stream_class, out_clock_class);
244 if (set_def_cc_status != BT_STREAM_CLASS_SET_DEFAULT_CLOCK_CLASS_STATUS_OK) {
245 status = (int) set_def_cc_status;
246 goto end;
ca9f27f3 247 }
ca9f27f3
FD
248 }
249
ce45f74a
PP
250 /*
251 * Safe to use the same value object because it's frozen at this
252 * point.
253 */
254 bt_stream_class_set_user_attributes(out_stream_class,
255 bt_stream_class_borrow_user_attributes_const(in_stream_class));
256
26fc5aed 257 bt_stream_class_set_supports_packets(
649934d2 258 out_stream_class,
26fc5aed 259 bt_stream_class_supports_packets(in_stream_class),
9b24b6aa 260 bt_stream_class_packets_have_beginning_default_clock_snapshot(
26fc5aed 261 in_stream_class),
9b24b6aa 262 bt_stream_class_packets_have_end_default_clock_snapshot(
649934d2 263 in_stream_class));
2e90378a
PP
264 bt_stream_class_set_supports_discarded_events(
265 out_stream_class,
266 bt_stream_class_supports_discarded_events(in_stream_class),
267 bt_stream_class_discarded_events_have_default_clock_snapshots(
268 in_stream_class));
269 bt_stream_class_set_supports_discarded_packets(
270 out_stream_class,
271 bt_stream_class_supports_discarded_packets(in_stream_class),
272 bt_stream_class_discarded_packets_have_default_clock_snapshots(
273 in_stream_class));
649934d2 274
ca9f27f3
FD
275 in_name = bt_stream_class_get_name(in_stream_class);
276 if (in_name) {
3b34b490
FD
277 enum bt_stream_class_set_name_status set_name_status =
278 bt_stream_class_set_name(out_stream_class, in_name);
279 if (set_name_status != BT_STREAM_CLASS_SET_NAME_STATUS_OK) {
280 BT_COMP_LOGE_APPEND_CAUSE(self_comp,
281 "Error set stream class name: "
282 "out-sc-addr=%p, name=%s", out_stream_class,
283 in_name);
284 status = (int) set_name_status;
285 goto end;
ca9f27f3
FD
286 }
287 }
288
289 bt_stream_class_set_assigns_automatic_stream_id(out_stream_class,
bc463d34 290 BT_FALSE);
ca9f27f3 291 bt_stream_class_set_assigns_automatic_event_class_id(out_stream_class,
bc463d34 292 BT_FALSE);
ca9f27f3
FD
293
294 /*
295 * Add the input packet context field class to the context to
296 * resolution in the further steps.
297 */
298 in_packet_context_fc =
299 bt_stream_class_borrow_packet_context_field_class_const(
bc463d34 300 in_stream_class);
ca9f27f3
FD
301 md_maps->fc_resolving_ctx->packet_context =
302 in_packet_context_fc;
303
304 if (in_packet_context_fc) {
3b34b490 305 enum bt_stream_class_set_field_class_status set_fc_status;
ca9f27f3 306 /* Copy packet context. */
bc463d34
FD
307 out_packet_context_fc = create_field_class_copy(md_maps,
308 in_packet_context_fc);
ca9f27f3 309
3b34b490 310 status = copy_field_class_content(md_maps, in_packet_context_fc,
bc463d34 311 out_packet_context_fc);
3b34b490
FD
312 if (status != DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK) {
313 BT_COMP_LOGE_APPEND_CAUSE(self_comp,
314 "Error copying stream class' packet context field class: "
315 "in-packet-ctx-fc-addr=%p, out-packet-ctx-fc-addr=%p",
316 in_packet_context_fc, out_packet_context_fc);
317 goto end;
ca9f27f3
FD
318 }
319
3b34b490
FD
320 set_fc_status = bt_stream_class_set_packet_context_field_class(
321 out_stream_class, out_packet_context_fc);
322 if (set_fc_status != BT_STREAM_CLASS_SET_FIELD_CLASS_STATUS_OK) {
323 BT_COMP_LOGE_APPEND_CAUSE(self_comp,
324 "Error setting stream class' packet context field class: "
325 "out-sc-addr=%p, out-packet-ctx-fc-addr=%p",
ca9f27f3 326 out_stream_class, out_packet_context_fc);
3b34b490
FD
327 status = (int) set_fc_status;
328 goto end;
ca9f27f3
FD
329 }
330 }
331
332 /*
333 * Add the input common context field class to the context to
334 * resolution in the further steps.
335 */
336 in_common_context_fc =
337 bt_stream_class_borrow_event_common_context_field_class_const(
bc463d34
FD
338 in_stream_class);
339 md_maps->fc_resolving_ctx->event_common_context = in_common_context_fc;
ca9f27f3
FD
340
341 if (in_common_context_fc) {
3b34b490 342 enum bt_stream_class_set_field_class_status set_fc_status;
ca9f27f3
FD
343 /* Copy common context. */
344 /* TODO: I find it a bit awkward to have this special function
345 * here to add the debug-info field class. I would like to
346 * abstract that.*/
bc463d34
FD
347 out_common_context_fc = create_field_class_copy(md_maps,
348 in_common_context_fc);
3b34b490 349 status = copy_event_common_context_field_class_content(md_maps,
bc463d34
FD
350 ir_maps->debug_info_field_class_name,
351 in_common_context_fc, out_common_context_fc);
3b34b490
FD
352 if (status != DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK) {
353 BT_COMP_LOGE_APPEND_CAUSE(self_comp,
354 "Error copying stream class' common context field class: "
355 "in-comm-ctx-fc-addr=%p, out-comm-ctx-fc-addr=%p",
356 in_common_context_fc, out_common_context_fc);
357 goto end;
ca9f27f3
FD
358 }
359
3b34b490
FD
360 set_fc_status = bt_stream_class_set_event_common_context_field_class(
361 out_stream_class, out_common_context_fc);
362 if (set_fc_status != BT_STREAM_CLASS_SET_FIELD_CLASS_STATUS_OK) {
363 BT_COMP_LOGE_APPEND_CAUSE(self_comp,
364 "Error setting stream class' common context field class: "
365 "out-sc-addr=%p, out-comm-ctx-fc-addr=%p",
ca9f27f3 366 out_stream_class, out_common_context_fc);
3b34b490
FD
367 status = (int) set_fc_status;
368 goto end;
ca9f27f3
FD
369 }
370 }
371
db5d746d
FD
372 /* Copy event classes contained in the stream class. */
373 ec_number = bt_stream_class_get_event_class_count(in_stream_class);
374 for (ec_idx = 0; ec_idx < ec_number; ec_idx++) {
375 bt_event_class *out_event_class;
376 const bt_event_class *in_event_class =
377 bt_stream_class_borrow_event_class_by_id_const(
378 in_stream_class, ec_idx);
379 out_event_class = trace_ir_mapping_borrow_mapped_event_class(
380 ir_maps, in_event_class);
381 if (!out_event_class) {
382 /*
383 * We don't need the new event_class yet. We simply
384 * want to create it and keep it in the map.
385 */
3b34b490 386 out_event_class = trace_ir_mapping_create_new_mapped_event_class(
db5d746d 387 ir_maps, in_event_class);
3b34b490
FD
388 if (!out_event_class) {
389 status = DEBUG_INFO_TRACE_IR_MAPPING_STATUS_MEMORY_ERROR;
390 goto end;
391 }
db5d746d
FD
392 }
393 }
394
91bc8451 395 BT_COMP_LOGD("Copied content of stream class: in-sc-addr=%p, out-sc-addr=%p",
bc463d34 396 in_stream_class, out_stream_class);
3b34b490
FD
397
398 status = DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK;
399end:
400 return status;
ca9f27f3
FD
401}
402
403BT_HIDDEN
3b34b490
FD
404enum debug_info_trace_ir_mapping_status copy_event_class_content(
405 struct trace_ir_maps *ir_maps,
ca9f27f3
FD
406 const bt_event_class *in_event_class,
407 bt_event_class *out_event_class)
408{
3b34b490 409 enum debug_info_trace_ir_mapping_status status;
ca9f27f3
FD
410 struct trace_ir_metadata_maps *md_maps;
411 const char *in_event_class_name, *in_emf_uri;
412 bt_property_availability prop_avail;
3a3d15f3 413 bt_event_class_log_level ec_log_level;
ca9f27f3
FD
414 bt_field_class *out_specific_context_fc, *out_payload_fc;
415 const bt_field_class *in_event_specific_context, *in_event_payload;
3a3d15f3 416 bt_logging_level log_level = ir_maps->log_level;
91bc8451 417 bt_self_component *self_comp = ir_maps->self_comp;
ca9f27f3 418
91bc8451 419 BT_COMP_LOGD("Copying content of event class: in-ec-addr=%p, out-ec-addr=%p",
bc463d34 420 in_event_class, out_event_class);
ca9f27f3
FD
421
422 /* Copy event class name. */
423 in_event_class_name = bt_event_class_get_name(in_event_class);
424 if (in_event_class_name) {
3b34b490
FD
425 enum bt_event_class_set_name_status set_name_status =
426 bt_event_class_set_name(out_event_class, in_event_class_name);
427 if (set_name_status != BT_EVENT_CLASS_SET_NAME_STATUS_OK) {
428 BT_COMP_LOGE_APPEND_CAUSE(self_comp, "Error setting event class' name: ec-addr=%p, "
ca9f27f3 429 "name=%s", out_event_class, in_event_class_name);
3b34b490
FD
430 status = (int) set_name_status;
431 goto end;
ca9f27f3
FD
432 }
433 }
434
ce45f74a
PP
435 /*
436 * Safe to use the same value object because it's frozen at this
437 * point.
438 */
439 bt_event_class_set_user_attributes(out_event_class,
440 bt_event_class_borrow_user_attributes_const(in_event_class));
441
ca9f27f3 442 /* Copy event class loglevel. */
3a3d15f3
PP
443 prop_avail = bt_event_class_get_log_level(in_event_class,
444 &ec_log_level);
ca9f27f3 445 if (prop_avail == BT_PROPERTY_AVAILABILITY_AVAILABLE) {
bc463d34 446 bt_event_class_set_log_level(out_event_class, ec_log_level);
ca9f27f3
FD
447 }
448
449 /* Copy event class emf uri. */
450 in_emf_uri = bt_event_class_get_emf_uri(in_event_class);
451 if (in_emf_uri) {
3b34b490
FD
452 enum bt_event_class_set_emf_uri_status set_emf_status =
453 bt_event_class_set_emf_uri(out_event_class, in_emf_uri);
454 if (set_emf_status != BT_EVENT_CLASS_SET_EMF_URI_STATUS_OK) {
455 BT_COMP_LOGE_APPEND_CAUSE(self_comp,
456 "Error setting event class' emf uri: "
457 "out-ec-addr=%p, emf-uri=\"%s\"",
458 out_event_class, in_emf_uri);
459 status = (int) set_emf_status;
460 goto end;
ca9f27f3
FD
461 }
462 }
463
bc463d34
FD
464 md_maps = borrow_metadata_maps_from_input_event_class(ir_maps,
465 in_event_class);
ca9f27f3
FD
466 /*
467 * Add the input event class' specific ctx to te
468 * context.
469 */
470 in_event_specific_context =
471 bt_event_class_borrow_specific_context_field_class_const(
bc463d34 472 in_event_class);
ca9f27f3
FD
473
474 md_maps->fc_resolving_ctx->event_specific_context =
475 in_event_specific_context;
476
477 if (in_event_specific_context) {
3b34b490 478 enum bt_event_class_set_field_class_status set_fc_status;
ca9f27f3
FD
479 /* Copy the specific context of this event class. */
480 out_specific_context_fc = create_field_class_copy(md_maps,
bc463d34 481 in_event_specific_context);
ca9f27f3 482
3b34b490 483 status = copy_field_class_content(md_maps,
bc463d34 484 in_event_specific_context, out_specific_context_fc);
3b34b490
FD
485 if (status != DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK) {
486 BT_COMP_LOGE_APPEND_CAUSE(self_comp,
487 "Error copying event class' specific context field class:"
488 "in-spec-ctx-fc-addr=%p, out-spec-ctx-fc-addr=%p",
489 in_event_specific_context, out_specific_context_fc);
490 goto end;
ca9f27f3
FD
491 }
492 /*
493 * Add the output specific context to the output event
494 * class.
495 */
3b34b490 496 set_fc_status = bt_event_class_set_specific_context_field_class(
ca9f27f3 497 out_event_class, out_specific_context_fc);
3b34b490
FD
498 if (set_fc_status != BT_EVENT_CLASS_SET_FIELD_CLASS_STATUS_OK) {
499 BT_COMP_LOGE_APPEND_CAUSE(self_comp,
500 "Error setting event class' specific context field class:"
501 "out-ec-addr=%p, out-spec-ctx-fc-addr=%p",
502 out_event_class, out_specific_context_fc);
503 status = (int) set_fc_status;
504 goto end;
ca9f27f3
FD
505 }
506 }
507
508 /*
509 * Add the input event class' payload field class to
510 * the context.
511 */
512 in_event_payload = bt_event_class_borrow_payload_field_class_const(
bc463d34 513 in_event_class);
ca9f27f3
FD
514
515 md_maps->fc_resolving_ctx->event_payload = in_event_payload;
516
517 if (in_event_payload) {
3b34b490
FD
518 enum bt_event_class_set_field_class_status set_fc_status;
519 /* Copy the payload of this event class. */
ca9f27f3 520 out_payload_fc = create_field_class_copy(md_maps,
bc463d34 521 in_event_payload);
3b34b490 522 status = copy_field_class_content(md_maps, in_event_payload,
bc463d34 523 out_payload_fc);
3b34b490
FD
524 if (status != DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK) {
525 BT_COMP_LOGE_APPEND_CAUSE(self_comp,
526 "Error copying event class' specific context field class:"
527 "in-payload-fc-addr=%p, out-payload-fc-addr=%p",
528 in_event_payload, out_payload_fc);
529 goto end;
ca9f27f3
FD
530 }
531
532 /* Add the output payload to the output event class. */
3b34b490
FD
533 set_fc_status = bt_event_class_set_payload_field_class(
534 out_event_class, out_payload_fc);
535 if (set_fc_status != BT_EVENT_CLASS_SET_FIELD_CLASS_STATUS_OK) {
536 BT_COMP_LOGE_APPEND_CAUSE(self_comp, "Error setting event class' payload field class: "
537 "out-ec-addr=%p, out-payload-fc-addr=%p",
ca9f27f3 538 out_event_class, out_payload_fc);
3b34b490
FD
539 status = (int) set_fc_status;
540 goto end;
ca9f27f3
FD
541 }
542 }
543
91bc8451 544 BT_COMP_LOGD("Copied content of event class: in-ec-addr=%p, out-ec-addr=%p",
bc463d34 545 in_event_class, out_event_class);
3b34b490
FD
546
547 status = DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK;
548end:
549 return status;
ca9f27f3
FD
550}
551
552BT_HIDDEN
3b34b490
FD
553enum debug_info_trace_ir_mapping_status
554copy_event_common_context_field_class_content(
ca9f27f3
FD
555 struct trace_ir_metadata_maps *md_maps,
556 const char *debug_info_fc_name,
557 const bt_field_class *in_field_class,
558 bt_field_class *out_field_class)
559{
3b34b490 560 enum debug_info_trace_ir_mapping_status status;
ca9f27f3
FD
561 bt_field_class *debug_field_class = NULL, *bin_field_class = NULL,
562 *func_field_class = NULL, *src_field_class = NULL;
3a3d15f3 563 bt_logging_level log_level = md_maps->log_level;
91bc8451 564 bt_self_component *self_comp = md_maps->self_comp;
ca9f27f3 565
91bc8451 566 BT_COMP_LOGD("Copying content of event common context field class: "
ca9f27f3
FD
567 "in-fc-addr=%p, out-fc-addr=%p", in_field_class, out_field_class);
568
569 /* Copy the content of the input common context. */
3b34b490
FD
570 status = copy_field_class_content(md_maps, in_field_class, out_field_class);
571 if (status != DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK) {
572 BT_COMP_LOGE_APPEND_CAUSE(self_comp,
573 "Error copying content of event common context field class: "
574 "in-fc-addr=%p, out-fc-addr=%p", in_field_class,
575 out_field_class);
ca9f27f3
FD
576 goto error;
577 }
578
579 /*
580 * If this event common context has the necessary fields to compute the
581 * debug information append the debug-info field class to the event
582 * common context.
583 */
584 if (is_event_common_ctx_dbg_info_compatible(in_field_class, debug_info_fc_name)) {
3b34b490 585 enum bt_field_class_structure_append_member_status append_member_status;
ca9f27f3
FD
586 /*
587 * The struct field and 3 sub-fields are not stored in the
588 * field class map because they don't have input equivalent.
589 * We need to put our reference each of these field classes
590 * once they are added to their respective containing field
591 * classes.
592 */
593 debug_field_class = bt_field_class_structure_create(
bc463d34 594 md_maps->output_trace_class);
ca9f27f3 595 if (!debug_field_class) {
3b34b490
FD
596 BT_COMP_LOGE_APPEND_CAUSE(self_comp,
597 "Failed to create debug_info structure.");
598 status = DEBUG_INFO_TRACE_IR_MAPPING_STATUS_MEMORY_ERROR;
ca9f27f3
FD
599 goto error;
600 }
601
602 bin_field_class = bt_field_class_string_create(
bc463d34 603 md_maps->output_trace_class);
ca9f27f3 604 if (!bin_field_class) {
3b34b490
FD
605 BT_COMP_LOGE_APPEND_CAUSE(self_comp,
606 "Failed to create string for field=\"bin\".");
607 status = DEBUG_INFO_TRACE_IR_MAPPING_STATUS_MEMORY_ERROR;
ca9f27f3
FD
608 goto error;
609 }
610
611 func_field_class = bt_field_class_string_create(
bc463d34 612 md_maps->output_trace_class);
ca9f27f3 613 if (!func_field_class) {
3b34b490
FD
614 BT_COMP_LOGE_APPEND_CAUSE(self_comp,
615 "Failed to create string for field=\"func\".");
616 status = DEBUG_INFO_TRACE_IR_MAPPING_STATUS_MEMORY_ERROR;
ca9f27f3
FD
617 goto error;
618 }
619
620 src_field_class = bt_field_class_string_create(
bc463d34 621 md_maps->output_trace_class);
ca9f27f3 622 if (!src_field_class) {
3b34b490
FD
623 BT_COMP_LOGE_APPEND_CAUSE(self_comp,
624 "Failed to create string for field=\"src\".");
625 status = DEBUG_INFO_TRACE_IR_MAPPING_STATUS_MEMORY_ERROR;
ca9f27f3
FD
626 goto error;
627 }
628
3b34b490
FD
629 append_member_status = bt_field_class_structure_append_member(
630 debug_field_class, "bin", bin_field_class);
631 if (append_member_status !=
d24d5663 632 BT_FIELD_CLASS_STRUCTURE_APPEND_MEMBER_STATUS_OK) {
3b34b490
FD
633 BT_COMP_LOGE_APPEND_CAUSE(self_comp,
634 "Failed to add a field to debug_info struct: "
635 "field=\"bin\".");
636 status = (int) append_member_status;
ca9f27f3
FD
637 goto error;
638 }
639 BT_FIELD_CLASS_PUT_REF_AND_RESET(bin_field_class);
640
3b34b490
FD
641 append_member_status = bt_field_class_structure_append_member(
642 debug_field_class, "func", func_field_class);
643 if (append_member_status !=
d24d5663 644 BT_FIELD_CLASS_STRUCTURE_APPEND_MEMBER_STATUS_OK) {
3b34b490
FD
645 BT_COMP_LOGE_APPEND_CAUSE(self_comp,
646 "Failed to add a field to debug_info struct: "
647 "field=\"func\".");
648 status = (int) append_member_status;
ca9f27f3
FD
649 goto error;
650 }
651 BT_FIELD_CLASS_PUT_REF_AND_RESET(func_field_class);
652
3b34b490
FD
653 append_member_status = bt_field_class_structure_append_member(
654 debug_field_class, "src", src_field_class);
655 if (append_member_status !=
d24d5663 656 BT_FIELD_CLASS_STRUCTURE_APPEND_MEMBER_STATUS_OK) {
3b34b490
FD
657 BT_COMP_LOGE_APPEND_CAUSE(self_comp,
658 "Failed to add a field to debug_info struct: "
659 "field=\"src\".");
660 status = (int) append_member_status;
ca9f27f3
FD
661 goto error;
662 }
663 BT_FIELD_CLASS_PUT_REF_AND_RESET(src_field_class);
664
665 /*Add the filled debug-info field class to the common context. */
3b34b490
FD
666 append_member_status = bt_field_class_structure_append_member(
667 out_field_class, debug_info_fc_name, debug_field_class);
668 if (append_member_status !=
d24d5663 669 BT_FIELD_CLASS_STRUCTURE_APPEND_MEMBER_STATUS_OK) {
3b34b490
FD
670 BT_COMP_LOGE_APPEND_CAUSE(self_comp,
671 "Failed to add debug_info field to event common context.");
672 status = (int) append_member_status;
ca9f27f3
FD
673 goto error;
674 }
675 BT_FIELD_CLASS_PUT_REF_AND_RESET(debug_field_class);
676 }
91bc8451 677 BT_COMP_LOGD("Copied content of event common context field class: "
ca9f27f3 678 "in-fc-addr=%p, out-fc-addr=%p", in_field_class, out_field_class);
3b34b490
FD
679
680 status = DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK;
ca9f27f3
FD
681 goto end;
682
683error:
684 if (debug_field_class) {
685 bt_field_class_put_ref(debug_field_class);
686 }
687 if (bin_field_class) {
688 bt_field_class_put_ref(bin_field_class);
689 }
690 if (func_field_class) {
691 bt_field_class_put_ref(func_field_class);
692 }
693 if (src_field_class) {
694 bt_field_class_put_ref(src_field_class);
695 }
696end:
3b34b490 697 return status;
ca9f27f3
FD
698}
699
700BT_HIDDEN
701bt_field_class *create_field_class_copy(struct trace_ir_metadata_maps *md_maps,
702 const bt_field_class *in_field_class)
703{
704 return create_field_class_copy_internal(md_maps, in_field_class);
705}
706
707BT_HIDDEN
3b34b490
FD
708enum debug_info_trace_ir_mapping_status copy_field_class_content(
709 struct trace_ir_metadata_maps *md_maps,
ca9f27f3
FD
710 const bt_field_class *in_field_class,
711 bt_field_class *out_field_class)
712{
713 return copy_field_class_content_internal(md_maps, in_field_class,
714 out_field_class);
715}
This page took 0.091377 seconds and 4 git commands to generate.