1 #ifndef BABELTRACE_PLUGIN_DEBUG_INFO_TRACE_IR_MAPPING_H
2 #define BABELTRACE_PLUGIN_DEBUG_INFO_TRACE_IR_MAPPING_H
4 * Copyright 2019 Francis Deslauriers francis.deslauriers@efficios.com>
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
27 #include "common/assert.h"
28 #include "common/macros.h"
29 #include <babeltrace2/babeltrace.h>
31 #include "debug-info.h"
33 enum debug_info_trace_ir_mapping_status
{
34 DEBUG_INFO_TRACE_IR_MAPPING_STATUS_OK
= 0,
35 DEBUG_INFO_TRACE_IR_MAPPING_STATUS_MEMORY_ERROR
= -12,
38 /* Used to resolve field paths for dynamic arrays and variant field classes. */
39 struct field_class_resolving_context
{
40 /* Weak reference. Owned by input stream class. */
41 const bt_field_class
*packet_context
;
42 /* Weak reference. Owned by input stream class. */
43 const bt_field_class
*event_common_context
;
44 /* Weak reference. Owned by input event class. */
45 const bt_field_class
*event_specific_context
;
46 /* Weak reference. Owned by input event class. */
47 const bt_field_class
*event_payload
;
50 struct trace_ir_metadata_maps
{
51 bt_logging_level log_level
;
52 bt_self_component
*self_comp
;
53 const bt_trace_class
*input_trace_class
;
54 bt_trace_class
*output_trace_class
;
57 * Map between input stream class and its corresponding output stream
59 * input stream class: weak reference. Owned by an upstream
61 * output stream class: owned by this structure.
63 GHashTable
*stream_class_map
;
66 * Map between input event class and its corresponding output event
68 * input event class: weak reference. Owned by an upstream component.
69 * output event class: owned by this structure.
71 GHashTable
*event_class_map
;
74 * Map between input field class and its corresponding output field
76 * input field class: weak reference. Owned by an upstream component.
77 * output field class: owned by this structure.
79 GHashTable
*field_class_map
;
82 * Map between input clock class and its corresponding output clock
84 * input clock class: weak reference. Owned by an upstream component.
85 * output clock class: owned by this structure.
87 GHashTable
*clock_class_map
;
89 struct field_class_resolving_context
*fc_resolving_ctx
;
91 bt_listener_id destruction_listener_id
;
94 struct trace_ir_data_maps
{
95 bt_logging_level log_level
;
96 bt_self_component
*self_comp
;
97 const bt_trace
*input_trace
;
98 bt_trace
*output_trace
;
101 * Map between input stream its corresponding output stream.
102 * input stream: weak reference. Owned by an upstream component.
103 * output stream: owned by this structure.
105 GHashTable
*stream_map
;
108 * Map between input packet its corresponding output packet.
109 * input packet: weak reference. Owned by an upstream packet component.
110 * output packet: owned by this structure.
112 GHashTable
*packet_map
;
114 bt_listener_id destruction_listener_id
;
117 struct trace_ir_maps
{
118 bt_logging_level log_level
;
121 * input trace -> trace_ir_data_maps.
122 * input trace: weak reference. Owned by an upstream component.
123 * trace_ir_data_maps: Owned by this structure.
125 GHashTable
*data_maps
;
128 * input trace class -> trace_ir_metadata_maps.
129 * input trace class: weak reference. Owned by an upstream component.
130 * trace_ir_metadata_maps: Owned by this structure.
132 GHashTable
*metadata_maps
;
134 char *debug_info_field_class_name
;
136 bt_self_component
*self_comp
;
140 struct trace_ir_maps
*trace_ir_maps_create(bt_self_component
*self_comp
,
141 const char *debug_info_field_name
, bt_logging_level log_level
);
144 void trace_ir_maps_clear(struct trace_ir_maps
*maps
);
147 void trace_ir_maps_destroy(struct trace_ir_maps
*maps
);
150 struct trace_ir_data_maps
*trace_ir_data_maps_create(
151 struct trace_ir_maps
*ir_maps
,
152 const bt_trace
*in_trace
);
155 void trace_ir_data_maps_destroy(struct trace_ir_data_maps
*d_maps
);
158 struct trace_ir_metadata_maps
*trace_ir_metadata_maps_create(
159 struct trace_ir_maps
*ir_maps
,
160 const bt_trace_class
*in_trace_class
);
163 void trace_ir_metadata_maps_destroy(struct trace_ir_metadata_maps
*md_maps
);
166 bt_stream_class
*trace_ir_mapping_create_new_mapped_stream_class(
167 struct trace_ir_maps
*ir_maps
,
168 const bt_stream_class
*in_stream_class
);
171 bt_stream_class
*trace_ir_mapping_borrow_mapped_stream_class(
172 struct trace_ir_maps
*ir_maps
,
173 const bt_stream_class
*in_stream_class
);
176 bt_stream
*trace_ir_mapping_create_new_mapped_stream(
177 struct trace_ir_maps
*ir_maps
,
178 const bt_stream
*in_stream
);
181 bt_stream
*trace_ir_mapping_borrow_mapped_stream(
182 struct trace_ir_maps
*ir_maps
,
183 const bt_stream
*in_stream
);
186 void trace_ir_mapping_remove_mapped_stream(
187 struct trace_ir_maps
*ir_maps
,
188 const bt_stream
*in_stream
);
191 bt_event_class
*trace_ir_mapping_create_new_mapped_event_class(
192 struct trace_ir_maps
*ir_maps
,
193 const bt_event_class
*in_event_class
);
196 bt_event_class
*trace_ir_mapping_borrow_mapped_event_class(
197 struct trace_ir_maps
*ir_maps
,
198 const bt_event_class
*in_event_class
);
201 bt_packet
*trace_ir_mapping_create_new_mapped_packet(
202 struct trace_ir_maps
*ir_maps
,
203 const bt_packet
*in_packet
);
206 bt_packet
*trace_ir_mapping_borrow_mapped_packet(
207 struct trace_ir_maps
*ir_maps
,
208 const bt_packet
*in_packet
);
211 void trace_ir_mapping_remove_mapped_packet(
212 struct trace_ir_maps
*ir_maps
,
213 const bt_packet
*in_packet
);
216 struct trace_ir_data_maps
*borrow_data_maps_from_input_trace(
217 struct trace_ir_maps
*ir_maps
, const bt_trace
*in_trace
)
222 struct trace_ir_data_maps
*d_maps
=
223 g_hash_table_lookup(ir_maps
->data_maps
, (gpointer
) in_trace
);
225 d_maps
= trace_ir_data_maps_create(ir_maps
, in_trace
);
226 g_hash_table_insert(ir_maps
->data_maps
, (gpointer
) in_trace
, d_maps
);
233 struct trace_ir_data_maps
*borrow_data_maps_from_input_stream(
234 struct trace_ir_maps
*ir_maps
, const bt_stream
*in_stream
)
237 BT_ASSERT(in_stream
);
239 return borrow_data_maps_from_input_trace(ir_maps
,
240 bt_stream_borrow_trace_const(in_stream
));
244 struct trace_ir_data_maps
*borrow_data_maps_from_input_packet(
245 struct trace_ir_maps
*ir_maps
, const bt_packet
*in_packet
)
248 BT_ASSERT(in_packet
);
250 return borrow_data_maps_from_input_stream(ir_maps
,
251 bt_packet_borrow_stream_const(in_packet
));
255 struct trace_ir_metadata_maps
*borrow_metadata_maps_from_input_trace_class(
256 struct trace_ir_maps
*ir_maps
,
257 const bt_trace_class
*in_trace_class
)
260 BT_ASSERT(in_trace_class
);
262 struct trace_ir_metadata_maps
*md_maps
=
263 g_hash_table_lookup(ir_maps
->metadata_maps
,
264 (gpointer
) in_trace_class
);
266 md_maps
= trace_ir_metadata_maps_create(ir_maps
, in_trace_class
);
267 g_hash_table_insert(ir_maps
->metadata_maps
,
268 (gpointer
) in_trace_class
, md_maps
);
275 struct trace_ir_metadata_maps
*borrow_metadata_maps_from_input_stream_class(
276 struct trace_ir_maps
*ir_maps
,
277 const bt_stream_class
*in_stream_class
) {
279 BT_ASSERT(in_stream_class
);
281 return borrow_metadata_maps_from_input_trace_class(ir_maps
,
282 bt_stream_class_borrow_trace_class_const(in_stream_class
));
286 struct trace_ir_metadata_maps
*borrow_metadata_maps_from_input_event_class(
287 struct trace_ir_maps
*ir_maps
,
288 const bt_event_class
*in_event_class
) {
290 BT_ASSERT(in_event_class
);
292 return borrow_metadata_maps_from_input_stream_class(ir_maps
,
293 bt_event_class_borrow_stream_class_const(in_event_class
));
296 #endif /* BABELTRACE_PLUGIN_DEBUG_INFO_TRACE_IR_MAPPING_H */