Re-format new C++ files
[babeltrace.git] / src / plugins / ctf / common / metadata / ctf-meta-update-meanings.cpp
1 /*
2 * SPDX-License-Identifier: MIT
3 *
4 * Copyright 2018 Philippe Proulx <pproulx@efficios.com>
5 */
6
7 #include <babeltrace2/babeltrace.h>
8 #include "common/macros.h"
9 #include "common/assert.h"
10 #include <glib.h>
11 #include <stdint.h>
12 #include <string.h>
13 #include <inttypes.h>
14
15 #include "ctf-meta-visitors.hpp"
16
17 static int set_int_field_class_meaning_by_name(struct ctf_field_class *fc, const char *field_name,
18 const char *id_name,
19 enum ctf_field_class_meaning meaning)
20 {
21 int ret = 0;
22 uint64_t i;
23
24 if (!fc) {
25 goto end;
26 }
27
28 switch (fc->type) {
29 case CTF_FIELD_CLASS_TYPE_INT:
30 case CTF_FIELD_CLASS_TYPE_ENUM:
31 {
32 struct ctf_field_class_int *int_fc = ctf_field_class_as_int(fc);
33
34 if (field_name && strcmp(field_name, id_name) == 0) {
35 int_fc->meaning = meaning;
36 }
37
38 break;
39 }
40 case CTF_FIELD_CLASS_TYPE_STRUCT:
41 {
42 struct ctf_field_class_struct *struct_fc = ctf_field_class_as_struct(fc);
43
44 for (i = 0; i < struct_fc->members->len; i++) {
45 struct ctf_named_field_class *named_fc =
46 ctf_field_class_struct_borrow_member_by_index(struct_fc, i);
47
48 ret = set_int_field_class_meaning_by_name(named_fc->fc, named_fc->name->str, id_name,
49 meaning);
50 if (ret) {
51 goto end;
52 }
53 }
54
55 break;
56 }
57 case CTF_FIELD_CLASS_TYPE_VARIANT:
58 {
59 struct ctf_field_class_variant *var_fc = ctf_field_class_as_variant(fc);
60
61 for (i = 0; i < var_fc->options->len; i++) {
62 struct ctf_named_field_class *named_fc =
63 ctf_field_class_variant_borrow_option_by_index(var_fc, i);
64
65 ret = set_int_field_class_meaning_by_name(named_fc->fc, NULL, id_name, meaning);
66 if (ret) {
67 goto end;
68 }
69 }
70
71 break;
72 }
73 case CTF_FIELD_CLASS_TYPE_ARRAY:
74 case CTF_FIELD_CLASS_TYPE_SEQUENCE:
75 {
76 struct ctf_field_class_array_base *array_fc = ctf_field_class_as_array_base(fc);
77
78 ret = set_int_field_class_meaning_by_name(array_fc->elem_fc, NULL, id_name, meaning);
79 if (ret) {
80 goto end;
81 }
82
83 break;
84 }
85 default:
86 break;
87 }
88
89 end:
90 return ret;
91 }
92
93 static int update_stream_class_meanings(struct ctf_stream_class *sc)
94 {
95 int ret = 0;
96 struct ctf_field_class_int *int_fc;
97 uint64_t i;
98
99 if (!sc->is_translated) {
100 if (sc->packet_context_fc) {
101 int_fc = ctf_field_class_struct_borrow_member_int_field_class_by_name(
102 ctf_field_class_as_struct(sc->packet_context_fc), "timestamp_begin");
103 if (int_fc) {
104 int_fc->meaning = CTF_FIELD_CLASS_MEANING_PACKET_BEGINNING_TIME;
105 }
106
107 int_fc = ctf_field_class_struct_borrow_member_int_field_class_by_name(
108 ctf_field_class_as_struct(sc->packet_context_fc), "timestamp_end");
109 if (int_fc) {
110 int_fc->meaning = CTF_FIELD_CLASS_MEANING_PACKET_END_TIME;
111
112 /*
113 * Remove mapped clock class to avoid updating
114 * the clock immediately when decoding.
115 */
116 int_fc->mapped_clock_class = NULL;
117 }
118
119 int_fc = ctf_field_class_struct_borrow_member_int_field_class_by_name(
120 ctf_field_class_as_struct(sc->packet_context_fc), "events_discarded");
121 if (int_fc) {
122 int_fc->meaning = CTF_FIELD_CLASS_MEANING_DISC_EV_REC_COUNTER_SNAPSHOT;
123 }
124
125 int_fc = ctf_field_class_struct_borrow_member_int_field_class_by_name(
126 ctf_field_class_as_struct(sc->packet_context_fc), "packet_seq_num");
127 if (int_fc) {
128 int_fc->meaning = CTF_FIELD_CLASS_MEANING_PACKET_COUNTER_SNAPSHOT;
129 }
130
131 int_fc = ctf_field_class_struct_borrow_member_int_field_class_by_name(
132 ctf_field_class_as_struct(sc->packet_context_fc), "packet_size");
133 if (int_fc) {
134 int_fc->meaning = CTF_FIELD_CLASS_MEANING_EXP_PACKET_TOTAL_SIZE;
135 }
136
137 int_fc = ctf_field_class_struct_borrow_member_int_field_class_by_name(
138 ctf_field_class_as_struct(sc->packet_context_fc), "content_size");
139 if (int_fc) {
140 int_fc->meaning = CTF_FIELD_CLASS_MEANING_EXP_PACKET_CONTENT_SIZE;
141 }
142 }
143
144 if (sc->event_header_fc) {
145 ret = set_int_field_class_meaning_by_name(sc->event_header_fc, NULL, "id",
146 CTF_FIELD_CLASS_MEANING_EVENT_CLASS_ID);
147 if (ret) {
148 goto end;
149 }
150 }
151 }
152
153 for (i = 0; i < sc->event_classes->len; i++) {
154 struct ctf_event_class *ec = (ctf_event_class *) sc->event_classes->pdata[i];
155
156 if (ec->is_translated) {
157 continue;
158 }
159 }
160
161 end:
162 return ret;
163 }
164
165 BT_HIDDEN
166 int ctf_trace_class_update_meanings(struct ctf_trace_class *ctf_tc)
167 {
168 int ret = 0;
169 struct ctf_field_class_int *int_fc;
170 struct ctf_named_field_class *named_fc;
171 uint64_t i;
172
173 if (!ctf_tc->is_translated && ctf_tc->packet_header_fc) {
174 int_fc = ctf_field_class_struct_borrow_member_int_field_class_by_name(
175 ctf_field_class_as_struct(ctf_tc->packet_header_fc), "magic");
176 if (int_fc) {
177 int_fc->meaning = CTF_FIELD_CLASS_MEANING_MAGIC;
178 }
179
180 int_fc = ctf_field_class_struct_borrow_member_int_field_class_by_name(
181 ctf_field_class_as_struct(ctf_tc->packet_header_fc), "stream_id");
182 if (int_fc) {
183 int_fc->meaning = CTF_FIELD_CLASS_MEANING_STREAM_CLASS_ID;
184 }
185
186 int_fc = ctf_field_class_struct_borrow_member_int_field_class_by_name(
187 ctf_field_class_as_struct(ctf_tc->packet_header_fc), "stream_instance_id");
188 if (int_fc) {
189 int_fc->meaning = CTF_FIELD_CLASS_MEANING_DATA_STREAM_ID;
190 }
191
192 named_fc = ctf_field_class_struct_borrow_member_by_name(
193 ctf_field_class_as_struct(ctf_tc->packet_header_fc), "uuid");
194 if (named_fc && named_fc->fc->type == CTF_FIELD_CLASS_TYPE_ARRAY) {
195 struct ctf_field_class_array *array_fc = ctf_field_class_as_array(named_fc->fc);
196
197 array_fc->meaning = CTF_FIELD_CLASS_MEANING_UUID;
198 }
199 }
200
201 for (i = 0; i < ctf_tc->stream_classes->len; i++) {
202 ret = update_stream_class_meanings((ctf_stream_class *) ctf_tc->stream_classes->pdata[i]);
203 if (ret) {
204 goto end;
205 }
206 }
207
208 end:
209 return ret;
210 }
This page took 0.033198 seconds and 4 git commands to generate.