Commit | Line | Data |
---|---|---|
55478183 PP |
1 | #ifndef BABELTRACE_PLUGINS_TEXT_DETAILS_DETAILS_H |
2 | #define BABELTRACE_PLUGINS_TEXT_DETAILS_DETAILS_H | |
3 | ||
4 | /* | |
5 | * Copyright 2019 Philippe Proulx <pproulx@efficios.com> | |
6 | * | |
7 | * Permission is hereby granted, free of charge, to any person obtaining a copy | |
8 | * of this software and associated documentation files (the "Software"), to deal | |
9 | * in the Software without restriction, including without limitation the rights | |
10 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |
11 | * copies of the Software, and to permit persons to whom the Software is | |
12 | * furnished to do so, subject to the following conditions: | |
13 | * | |
14 | * The above copyright notice and this permission notice shall be included in | |
15 | * all copies or substantial portions of the Software. | |
16 | * | |
17 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
18 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
19 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
20 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
21 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
22 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | |
23 | * SOFTWARE. | |
24 | */ | |
25 | ||
26 | #include <glib.h> | |
27 | #include <babeltrace2/babeltrace.h> | |
28 | #include <stdbool.h> | |
29 | ||
30 | /* | |
31 | * This structure contains a hash table which maps trace IR stream class | |
32 | * and event class addresses to whether or not they have been printed | |
33 | * already during the lifetime of the component. | |
34 | * | |
35 | * It is safe to keep the addresses (weak references) in this hash table | |
36 | * as long as the trace class to which the structure is associated | |
37 | * exists because it's not possible to remove stream classes from a | |
38 | * trace class and event classes from a stream class. | |
39 | */ | |
40 | struct details_trace_class_meta { | |
41 | /* | |
42 | * Stream class or event class address (`const void *`) -> | |
43 | * `guint` (as a pointer) | |
44 | * | |
45 | * This acts as a set in fact; we don't care about the values, | |
46 | * but we put 1 so that we can use g_hash_table_lookup() to know | |
47 | * whether or not the hash table contains a given key | |
48 | * (g_hash_table_lookup() returns `NULL` when not found, but | |
49 | * also when the value is `NULL`). | |
50 | */ | |
51 | GHashTable *objects; | |
52 | ||
53 | /* | |
54 | * Trace class destruction listener ID (`UINT64_C(-1)` if | |
55 | * there's no listener ID. | |
56 | */ | |
2054a0d1 | 57 | bt_listener_id tc_destruction_listener_id; |
55478183 PP |
58 | }; |
59 | ||
60 | /* | |
61 | * An entry of the `traces` hash table of a | |
62 | * `struct details_comp` structure. | |
63 | */ | |
64 | struct details_trace { | |
65 | /* Unique ID of this trace within the lifetime of the component */ | |
66 | uint64_t unique_id; | |
67 | ||
68 | /* | |
69 | * Trace destruction listener ID (`UINT64_C(-1)` if there's no | |
70 | * listener ID. | |
71 | */ | |
2054a0d1 | 72 | bt_listener_id trace_destruction_listener_id; |
55478183 PP |
73 | }; |
74 | ||
75 | /* A `sink.text.details` component */ | |
76 | struct details_comp { | |
6c868a3a | 77 | bt_logging_level log_level; |
d400b9e6 | 78 | bt_self_component *self_comp; |
6c868a3a | 79 | |
55478183 PP |
80 | /* Component's configuration */ |
81 | struct { | |
cc413248 PP |
82 | /* Write data objects */ |
83 | bool with_data; | |
84 | ||
55478183 PP |
85 | /* Write metadata objects */ |
86 | bool with_meta; | |
87 | ||
88 | /* | |
89 | * Compact mode: each line is a single message, and | |
90 | * there are no extended message properties and | |
91 | * event/packet fields. `with_meta` can still be true in | |
92 | * compact mode, printing the full metadata objects, but | |
93 | * making the messages compact. | |
94 | */ | |
95 | bool compact; | |
96 | ||
97 | /* Colorize output */ | |
98 | bool with_color; | |
99 | ||
100 | /* Write message's time */ | |
101 | bool with_time; | |
102 | ||
55478183 PP |
103 | /* Write trace's name */ |
104 | bool with_trace_name; | |
105 | ||
106 | /* Write stream class's name */ | |
107 | bool with_stream_class_name; | |
108 | ||
109 | /* Write stream's name */ | |
110 | bool with_stream_name; | |
111 | ||
112 | /* Write UUID */ | |
113 | bool with_uuid; | |
114 | } cfg; | |
115 | ||
116 | /* | |
117 | * `const bt_trace_class *` (weak) -> | |
118 | * `struct details_trace_class_meta *` (owned by this) | |
119 | * | |
120 | * The key (trace class object) is weak. An entry is added, if | |
121 | * `cfg.with_meta` above is true, when first encountering a | |
122 | * trace class. An entry is removed when a trace class is | |
123 | * destroyed or when the component is finalized. | |
124 | */ | |
125 | GHashTable *meta; | |
126 | ||
127 | /* | |
128 | * `const bt_trace *` (weak) -> | |
129 | * `struct details_trace *` (owner by this) | |
130 | * | |
131 | * This hash table associates a trace object to a unique ID | |
132 | * within the lifetime of this component. This is used to easily | |
133 | * follow the messages of a given trace/stream when reading the | |
134 | * text output of the component. We cannot use the actual stream | |
135 | * ID properties for this because many streams can share the | |
136 | * same ID (with different stream classes or different traces). | |
137 | * | |
138 | * When adding an entry, the unique ID to use is | |
139 | * `next_unique_trace_id`. | |
140 | * | |
141 | * An entry is added when first encountering a trace. An entry | |
142 | * is removed when a trace is destroyed or when the component is | |
143 | * finalized. | |
144 | */ | |
145 | GHashTable *traces; | |
146 | uint32_t next_unique_trace_id; | |
147 | ||
148 | /* Upstream message iterator */ | |
149 | bt_self_component_port_input_message_iterator *msg_iter; | |
150 | ||
151 | /* | |
152 | * True if this component printed something. This is used to | |
153 | * prepend a newline to the next message string instead of | |
154 | * appending it so that the last printed message is not followed | |
155 | * with an empty line. | |
156 | */ | |
157 | bool printed_something; | |
158 | ||
159 | /* Current message's output buffer */ | |
160 | GString *str; | |
161 | }; | |
162 | ||
163 | BT_HIDDEN | |
21a9f056 | 164 | bt_component_class_initialize_method_status details_init( |
55478183 | 165 | bt_self_component_sink *component, |
59225a3e | 166 | bt_self_component_sink_configuration *config, |
55478183 PP |
167 | const bt_value *params, void *init_method_data); |
168 | ||
169 | BT_HIDDEN | |
170 | void details_finalize(bt_self_component_sink *component); | |
171 | ||
172 | BT_HIDDEN | |
d24d5663 | 173 | bt_component_class_sink_graph_is_configured_method_status details_graph_is_configured( |
55478183 PP |
174 | bt_self_component_sink *comp); |
175 | ||
176 | BT_HIDDEN | |
d24d5663 | 177 | bt_component_class_sink_consume_method_status details_consume(bt_self_component_sink *component); |
55478183 PP |
178 | |
179 | BT_HIDDEN | |
180 | void details_destroy_details_trace_class_meta( | |
181 | struct details_trace_class_meta *details_trace_class_meta); | |
182 | ||
183 | BT_HIDDEN | |
184 | struct details_trace_class_meta *details_create_details_trace_class_meta(void); | |
185 | ||
186 | #endif /* BABELTRACE_PLUGINS_TEXT_DETAILS_DETAILS_H */ |