2 * SPDX-License-Identifier: MIT
4 * Copyright 2019 Francis Deslauriers francis.deslauriers@efficios.com>
7 #ifndef BABELTRACE_PLUGIN_DEBUG_INFO_TRACE_IR_MAPPING_H
8 #define BABELTRACE_PLUGIN_DEBUG_INFO_TRACE_IR_MAPPING_H
12 #include "common/assert.h"
13 #include "common/macros.h"
14 #include <babeltrace2/babeltrace.h>
16 #include "debug-info.h"
18 enum debug_info_trace_ir_mapping_status
{
19 DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK
= 0,
20 DEBUG_INFO_TRACE_IR_MAPPING_STATUS_MEMORY_ERROR
= -12,
23 /* Used to resolve field paths for dynamic arrays and variant field classes. */
24 struct field_class_resolving_context
{
25 /* Weak reference. Owned by input stream class. */
26 const bt_field_class
*packet_context
;
27 /* Weak reference. Owned by input stream class. */
28 const bt_field_class
*event_common_context
;
29 /* Weak reference. Owned by input event class. */
30 const bt_field_class
*event_specific_context
;
31 /* Weak reference. Owned by input event class. */
32 const bt_field_class
*event_payload
;
35 struct trace_ir_metadata_maps
{
36 bt_logging_level log_level
;
37 bt_self_component
*self_comp
;
38 const bt_trace_class
*input_trace_class
;
39 bt_trace_class
*output_trace_class
;
42 * Map between input stream class and its corresponding output stream
44 * input stream class: weak reference. Owned by an upstream
46 * output stream class: owned by this structure.
48 GHashTable
*stream_class_map
;
51 * Map between input event class and its corresponding output event
53 * input event class: weak reference. Owned by an upstream component.
54 * output event class: owned by this structure.
56 GHashTable
*event_class_map
;
59 * Map between input field class and its corresponding output field
61 * input field class: weak reference. Owned by an upstream component.
62 * output field class: owned by this structure.
64 GHashTable
*field_class_map
;
67 * Map between input clock class and its corresponding output clock
69 * input clock class: weak reference. Owned by an upstream component.
70 * output clock class: owned by this structure.
72 GHashTable
*clock_class_map
;
74 struct field_class_resolving_context
*fc_resolving_ctx
;
76 bt_listener_id destruction_listener_id
;
79 struct trace_ir_data_maps
{
80 bt_logging_level log_level
;
81 bt_self_component
*self_comp
;
82 const bt_trace
*input_trace
;
83 bt_trace
*output_trace
;
86 * Map between input stream its corresponding output stream.
87 * input stream: weak reference. Owned by an upstream component.
88 * output stream: owned by this structure.
90 GHashTable
*stream_map
;
93 * Map between input packet its corresponding output packet.
94 * input packet: weak reference. Owned by an upstream packet component.
95 * output packet: owned by this structure.
97 GHashTable
*packet_map
;
99 bt_listener_id destruction_listener_id
;
102 struct trace_ir_maps
{
103 bt_logging_level log_level
;
106 * input trace -> trace_ir_data_maps.
107 * input trace: weak reference. Owned by an upstream component.
108 * trace_ir_data_maps: Owned by this structure.
110 GHashTable
*data_maps
;
113 * input trace class -> trace_ir_metadata_maps.
114 * input trace class: weak reference. Owned by an upstream component.
115 * trace_ir_metadata_maps: Owned by this structure.
117 GHashTable
*metadata_maps
;
119 char *debug_info_field_class_name
;
121 bt_self_component
*self_comp
;
125 struct trace_ir_maps
*trace_ir_maps_create(bt_self_component
*self_comp
,
126 const char *debug_info_field_name
, bt_logging_level log_level
);
129 void trace_ir_maps_clear(struct trace_ir_maps
*maps
);
132 void trace_ir_maps_destroy(struct trace_ir_maps
*maps
);
135 struct trace_ir_data_maps
*trace_ir_data_maps_create(
136 struct trace_ir_maps
*ir_maps
,
137 const bt_trace
*in_trace
);
140 void trace_ir_data_maps_destroy(struct trace_ir_data_maps
*d_maps
);
143 struct trace_ir_metadata_maps
*trace_ir_metadata_maps_create(
144 struct trace_ir_maps
*ir_maps
,
145 const bt_trace_class
*in_trace_class
);
148 void trace_ir_metadata_maps_destroy(struct trace_ir_metadata_maps
*md_maps
);
151 bt_stream_class
*trace_ir_mapping_create_new_mapped_stream_class(
152 struct trace_ir_maps
*ir_maps
,
153 const bt_stream_class
*in_stream_class
);
156 bt_stream_class
*trace_ir_mapping_borrow_mapped_stream_class(
157 struct trace_ir_maps
*ir_maps
,
158 const bt_stream_class
*in_stream_class
);
161 bt_stream
*trace_ir_mapping_create_new_mapped_stream(
162 struct trace_ir_maps
*ir_maps
,
163 const bt_stream
*in_stream
);
166 bt_stream
*trace_ir_mapping_borrow_mapped_stream(
167 struct trace_ir_maps
*ir_maps
,
168 const bt_stream
*in_stream
);
171 void trace_ir_mapping_remove_mapped_stream(
172 struct trace_ir_maps
*ir_maps
,
173 const bt_stream
*in_stream
);
176 bt_event_class
*trace_ir_mapping_create_new_mapped_event_class(
177 struct trace_ir_maps
*ir_maps
,
178 const bt_event_class
*in_event_class
);
181 bt_event_class
*trace_ir_mapping_borrow_mapped_event_class(
182 struct trace_ir_maps
*ir_maps
,
183 const bt_event_class
*in_event_class
);
186 bt_packet
*trace_ir_mapping_create_new_mapped_packet(
187 struct trace_ir_maps
*ir_maps
,
188 const bt_packet
*in_packet
);
191 bt_packet
*trace_ir_mapping_borrow_mapped_packet(
192 struct trace_ir_maps
*ir_maps
,
193 const bt_packet
*in_packet
);
196 void trace_ir_mapping_remove_mapped_packet(
197 struct trace_ir_maps
*ir_maps
,
198 const bt_packet
*in_packet
);
201 struct trace_ir_data_maps
*borrow_data_maps_from_input_trace(
202 struct trace_ir_maps
*ir_maps
, const bt_trace
*in_trace
)
207 struct trace_ir_data_maps
*d_maps
=
208 g_hash_table_lookup(ir_maps
->data_maps
, (gpointer
) in_trace
);
210 d_maps
= trace_ir_data_maps_create(ir_maps
, in_trace
);
211 g_hash_table_insert(ir_maps
->data_maps
, (gpointer
) in_trace
, d_maps
);
218 struct trace_ir_data_maps
*borrow_data_maps_from_input_stream(
219 struct trace_ir_maps
*ir_maps
, const bt_stream
*in_stream
)
222 BT_ASSERT(in_stream
);
224 return borrow_data_maps_from_input_trace(ir_maps
,
225 bt_stream_borrow_trace_const(in_stream
));
229 struct trace_ir_data_maps
*borrow_data_maps_from_input_packet(
230 struct trace_ir_maps
*ir_maps
, const bt_packet
*in_packet
)
233 BT_ASSERT(in_packet
);
235 return borrow_data_maps_from_input_stream(ir_maps
,
236 bt_packet_borrow_stream_const(in_packet
));
240 struct trace_ir_metadata_maps
*borrow_metadata_maps_from_input_trace_class(
241 struct trace_ir_maps
*ir_maps
,
242 const bt_trace_class
*in_trace_class
)
245 BT_ASSERT(in_trace_class
);
247 struct trace_ir_metadata_maps
*md_maps
=
248 g_hash_table_lookup(ir_maps
->metadata_maps
,
249 (gpointer
) in_trace_class
);
251 md_maps
= trace_ir_metadata_maps_create(ir_maps
, in_trace_class
);
252 g_hash_table_insert(ir_maps
->metadata_maps
,
253 (gpointer
) in_trace_class
, md_maps
);
260 struct trace_ir_metadata_maps
*borrow_metadata_maps_from_input_stream_class(
261 struct trace_ir_maps
*ir_maps
,
262 const bt_stream_class
*in_stream_class
) {
264 BT_ASSERT(in_stream_class
);
266 return borrow_metadata_maps_from_input_trace_class(ir_maps
,
267 bt_stream_class_borrow_trace_class_const(in_stream_class
));
271 struct trace_ir_metadata_maps
*borrow_metadata_maps_from_input_event_class(
272 struct trace_ir_maps
*ir_maps
,
273 const bt_event_class
*in_event_class
) {
275 BT_ASSERT(in_event_class
);
277 return borrow_metadata_maps_from_input_stream_class(ir_maps
,
278 bt_event_class_borrow_stream_class_const(in_event_class
));
281 #endif /* BABELTRACE_PLUGIN_DEBUG_INFO_TRACE_IR_MAPPING_H */