ctf: append error causes when returning errors
[babeltrace.git] / src / plugins / ctf / common / metadata / ctf-meta-update-default-clock-classes.c
1 /*
2 * SPDX-License-Identifier: MIT
3 *
4 * Copyright 2018 Philippe Proulx <pproulx@efficios.com>
5 */
6
7 #define BT_COMP_LOG_SELF_COMP (log_cfg->self_comp)
8 #define BT_COMP_LOG_SELF_COMP_CLASS (log_cfg->self_comp_class)
9 #define BT_LOG_OUTPUT_LEVEL (log_cfg->log_level)
10 #define BT_LOG_TAG "PLUGIN/CTF/META/UPDATE-DEF-CC"
11 #include "logging/comp-logging.h"
12
13 #include <babeltrace2/babeltrace.h>
14 #include "common/macros.h"
15 #include "common/assert.h"
16 #include <glib.h>
17 #include <stdint.h>
18 #include <string.h>
19 #include <inttypes.h>
20
21 #include "ctf-meta-visitors.h"
22 #include "logging.h"
23
24 static inline
25 int find_mapped_clock_class(struct ctf_field_class *fc,
26 struct ctf_clock_class **clock_class,
27 struct meta_log_config *log_cfg)
28 {
29 int ret = 0;
30 uint64_t i;
31
32 if (!fc) {
33 goto end;
34 }
35
36 switch (fc->type) {
37 case CTF_FIELD_CLASS_TYPE_INT:
38 case CTF_FIELD_CLASS_TYPE_ENUM:
39 {
40 struct ctf_field_class_int *int_fc = (void *) fc;
41
42 if (int_fc->mapped_clock_class) {
43 if (*clock_class && *clock_class !=
44 int_fc->mapped_clock_class) {
45 _BT_COMP_OR_COMP_CLASS_LOGE_APPEND_CAUSE("Stream class contains more than one "
46 "clock class: expected-cc-name=\"%s\", "
47 "other-cc-name=\"%s\"",
48 (*clock_class)->name->str,
49 int_fc->mapped_clock_class->name->str);
50 ret = -1;
51 goto end;
52 }
53
54 *clock_class = int_fc->mapped_clock_class;
55 }
56
57 break;
58 }
59 case CTF_FIELD_CLASS_TYPE_STRUCT:
60 {
61 struct ctf_field_class_struct *struct_fc = (void *) fc;
62
63 for (i = 0; i < struct_fc->members->len; i++) {
64 struct ctf_named_field_class *named_fc =
65 ctf_field_class_struct_borrow_member_by_index(
66 struct_fc, i);
67
68 ret = find_mapped_clock_class(named_fc->fc,
69 clock_class, log_cfg);
70 if (ret) {
71 goto end;
72 }
73 }
74
75 break;
76 }
77 case CTF_FIELD_CLASS_TYPE_VARIANT:
78 {
79 struct ctf_field_class_variant *var_fc = (void *) fc;
80
81 for (i = 0; i < var_fc->options->len; i++) {
82 struct ctf_named_field_class *named_fc =
83 ctf_field_class_variant_borrow_option_by_index(
84 var_fc, i);
85
86 ret = find_mapped_clock_class(named_fc->fc,
87 clock_class, log_cfg);
88 if (ret) {
89 goto end;
90 }
91 }
92
93 break;
94 }
95 case CTF_FIELD_CLASS_TYPE_ARRAY:
96 case CTF_FIELD_CLASS_TYPE_SEQUENCE:
97 {
98 struct ctf_field_class_array_base *array_fc = (void *) fc;
99
100 ret = find_mapped_clock_class(array_fc->elem_fc, clock_class,
101 log_cfg);
102 if (ret) {
103 goto end;
104 }
105
106 break;
107 }
108 default:
109 break;
110 }
111
112 end:
113 return ret;
114 }
115
116 static inline
117 int update_stream_class_default_clock_class(
118 struct ctf_stream_class *stream_class,
119 struct meta_log_config *log_cfg)
120 {
121 int ret = 0;
122 struct ctf_clock_class *clock_class =
123 stream_class->default_clock_class;
124 uint64_t i;
125
126 ret = find_mapped_clock_class(stream_class->packet_context_fc,
127 &clock_class, log_cfg);
128 if (ret) {
129 goto end;
130 }
131
132 ret = find_mapped_clock_class(stream_class->event_header_fc,
133 &clock_class, log_cfg);
134 if (ret) {
135 goto end;
136 }
137
138 ret = find_mapped_clock_class(stream_class->event_common_context_fc,
139 &clock_class, log_cfg);
140 if (ret) {
141 goto end;
142 }
143
144 for (i = 0; i < stream_class->event_classes->len; i++) {
145 struct ctf_event_class *event_class =
146 stream_class->event_classes->pdata[i];
147
148 ret = find_mapped_clock_class(event_class->spec_context_fc,
149 &clock_class, log_cfg);
150 if (ret) {
151 goto end;
152 }
153
154 ret = find_mapped_clock_class(event_class->payload_fc,
155 &clock_class, log_cfg);
156 if (ret) {
157 goto end;
158 }
159 }
160
161 if (!stream_class->default_clock_class) {
162 stream_class->default_clock_class = clock_class;
163 }
164
165 end:
166 return ret;
167 }
168
169 BT_HIDDEN
170 int ctf_trace_class_update_default_clock_classes(struct ctf_trace_class *ctf_tc,
171 struct meta_log_config *log_cfg)
172 {
173 uint64_t i;
174 int ret = 0;
175 struct ctf_clock_class *clock_class = NULL;
176
177 ret = find_mapped_clock_class(ctf_tc->packet_header_fc, &clock_class,
178 log_cfg);
179 if (ret) {
180 goto end;
181 }
182
183 if (clock_class) {
184 ret = -1;
185 goto end;
186 }
187
188 for (i = 0; i < ctf_tc->stream_classes->len; i++) {
189 struct ctf_stream_class *sc =
190 ctf_tc->stream_classes->pdata[i];
191
192 ret = update_stream_class_default_clock_class(
193 ctf_tc->stream_classes->pdata[i], log_cfg);
194 if (ret) {
195 _BT_COMP_OR_COMP_CLASS_LOGE_APPEND_CAUSE("Stream class contains more than one "
196 "clock class: stream-class-id=%" PRIu64,
197 sc->id);
198 goto end;
199 }
200 }
201
202 end:
203 return ret;
204 }
This page took 0.033281 seconds and 4 git commands to generate.