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 /* Used to resolve field paths for dynamic arrays and variant field classes. */
34 struct field_class_resolving_context
{
35 /* Weak reference. Owned by input stream class. */
36 const bt_field_class
*packet_context
;
37 /* Weak reference. Owned by input stream class. */
38 const bt_field_class
*event_common_context
;
39 /* Weak reference. Owned by input event class. */
40 const bt_field_class
*event_specific_context
;
41 /* Weak reference. Owned by input event class. */
42 const bt_field_class
*event_payload
;
45 struct trace_ir_metadata_maps
{
46 const bt_trace_class
*input_trace_class
;
47 bt_trace_class
*output_trace_class
;
50 * Map between input stream class and its corresponding output stream
52 * input stream class: weak reference. Owned by an upstream
54 * output stream class: owned by this structure.
56 GHashTable
*stream_class_map
;
59 * Map between input event class and its corresponding output event
61 * input event class: weak reference. Owned by an upstream component.
62 * output event class: owned by this structure.
64 GHashTable
*event_class_map
;
67 * Map between input field class and its corresponding output field
69 * input field class: weak reference. Owned by an upstream component.
70 * output field class: owned by this structure.
72 GHashTable
*field_class_map
;
75 * Map between input clock class and its corresponding output clock
77 * input clock class: weak reference. Owned by an upstream component.
78 * output clock class: owned by this structure.
80 GHashTable
*clock_class_map
;
82 struct field_class_resolving_context
*fc_resolving_ctx
;
84 uint64_t destruction_listener_id
;
87 struct trace_ir_data_maps
{
88 const bt_trace
*input_trace
;
89 bt_trace
*output_trace
;
92 * Map between input stream its corresponding output stream.
93 * input stream: weak reference. Owned by an upstream component.
94 * output stream: owned by this structure.
96 GHashTable
*stream_map
;
99 * Map between input packet its corresponding output packet.
100 * input packet: weak reference. Owned by an upstream packet component.
101 * output packet: owned by this structure.
103 GHashTable
*packet_map
;
105 uint64_t destruction_listener_id
;
108 struct trace_ir_maps
{
110 * input trace -> trace_ir_data_maps.
111 * input trace: weak reference. Owned by an upstream component.
112 * trace_ir_data_maps: Owned by this structure.
114 GHashTable
*data_maps
;
117 * input trace class -> trace_ir_metadata_maps.
118 * input trace class: weak reference. Owned by an upstream component.
119 * trace_ir_metadata_maps: Owned by this structure.
121 GHashTable
*metadata_maps
;
123 char *debug_info_field_class_name
;
125 bt_self_component
*self_comp
;
129 struct trace_ir_maps
*trace_ir_maps_create(bt_self_component
*self_comp
,
130 const char *debug_info_field_name
);
133 void trace_ir_maps_clear(struct trace_ir_maps
*maps
);
136 void trace_ir_maps_destroy(struct trace_ir_maps
*maps
);
139 struct trace_ir_data_maps
*trace_ir_data_maps_create(
140 struct trace_ir_maps
*ir_maps
,
141 const bt_trace
*in_trace
);
144 void trace_ir_data_maps_destroy(struct trace_ir_data_maps
*d_maps
);
147 struct trace_ir_metadata_maps
*trace_ir_metadata_maps_create(
148 struct trace_ir_maps
*ir_maps
,
149 const bt_trace_class
*in_trace_class
);
152 void trace_ir_metadata_maps_destroy(struct trace_ir_metadata_maps
*md_maps
);
155 bt_stream
*trace_ir_mapping_create_new_mapped_stream(
156 struct trace_ir_maps
*ir_maps
,
157 const bt_stream
*in_stream
);
160 bt_stream
*trace_ir_mapping_borrow_mapped_stream(
161 struct trace_ir_maps
*ir_maps
,
162 const bt_stream
*in_stream
);
165 void trace_ir_mapping_remove_mapped_stream(
166 struct trace_ir_maps
*ir_maps
,
167 const bt_stream
*in_stream
);
170 bt_event_class
*trace_ir_mapping_create_new_mapped_event_class(
171 struct trace_ir_maps
*ir_maps
,
172 const bt_event_class
*in_event_class
);
175 bt_event_class
*trace_ir_mapping_borrow_mapped_event_class(
176 struct trace_ir_maps
*ir_maps
,
177 const bt_event_class
*in_event_class
);
180 bt_packet
*trace_ir_mapping_create_new_mapped_packet(
181 struct trace_ir_maps
*ir_maps
,
182 const bt_packet
*in_packet
);
185 bt_packet
*trace_ir_mapping_borrow_mapped_packet(
186 struct trace_ir_maps
*ir_maps
,
187 const bt_packet
*in_packet
);
190 void trace_ir_mapping_remove_mapped_packet(
191 struct trace_ir_maps
*ir_maps
,
192 const bt_packet
*in_packet
);
195 struct trace_ir_data_maps
*borrow_data_maps_from_input_trace(
196 struct trace_ir_maps
*ir_maps
, const bt_trace
*in_trace
)
201 struct trace_ir_data_maps
*d_maps
=
202 g_hash_table_lookup(ir_maps
->data_maps
, (gpointer
) in_trace
);
204 d_maps
= trace_ir_data_maps_create(ir_maps
, in_trace
);
205 g_hash_table_insert(ir_maps
->data_maps
, (gpointer
) in_trace
, d_maps
);
212 struct trace_ir_data_maps
*borrow_data_maps_from_input_stream(
213 struct trace_ir_maps
*ir_maps
, const bt_stream
*in_stream
)
216 BT_ASSERT(in_stream
);
218 return borrow_data_maps_from_input_trace(ir_maps
,
219 bt_stream_borrow_trace_const(in_stream
));
223 struct trace_ir_data_maps
*borrow_data_maps_from_input_packet(
224 struct trace_ir_maps
*ir_maps
, const bt_packet
*in_packet
)
227 BT_ASSERT(in_packet
);
229 return borrow_data_maps_from_input_stream(ir_maps
,
230 bt_packet_borrow_stream_const(in_packet
));
234 struct trace_ir_metadata_maps
*borrow_metadata_maps_from_input_trace_class(
235 struct trace_ir_maps
*ir_maps
,
236 const bt_trace_class
*in_trace_class
)
239 BT_ASSERT(in_trace_class
);
241 struct trace_ir_metadata_maps
*md_maps
=
242 g_hash_table_lookup(ir_maps
->metadata_maps
,
243 (gpointer
) in_trace_class
);
245 md_maps
= trace_ir_metadata_maps_create(ir_maps
, in_trace_class
);
246 g_hash_table_insert(ir_maps
->metadata_maps
,
247 (gpointer
) in_trace_class
, md_maps
);
254 struct trace_ir_metadata_maps
*borrow_metadata_maps_from_input_stream_class(
255 struct trace_ir_maps
*ir_maps
,
256 const bt_stream_class
*in_stream_class
) {
258 BT_ASSERT(in_stream_class
);
260 return borrow_metadata_maps_from_input_trace_class(ir_maps
,
261 bt_stream_class_borrow_trace_class_const(in_stream_class
));
265 struct trace_ir_metadata_maps
*borrow_metadata_maps_from_input_event_class(
266 struct trace_ir_maps
*ir_maps
,
267 const bt_event_class
*in_event_class
) {
269 BT_ASSERT(in_event_class
);
271 return borrow_metadata_maps_from_input_stream_class(ir_maps
,
272 bt_event_class_borrow_stream_class_const(in_event_class
));
275 #endif /* BABELTRACE_PLUGIN_DEBUG_INFO_TRACE_IR_MAPPING_H */