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