copytrace: create empty stream classes by default
[babeltrace.git] / plugins / libctfcopytrace / ctfcopytrace.c
CommitLineData
91b73004
JD
1/*
2 * copytrace.c
3 *
4 * Babeltrace library to create a copy of a CTF trace
5 *
6 * Copyright 2017 Julien Desfossez <jdesfossez@efficios.com>
7 *
8 * Author: Julien Desfossez <jdesfossez@efficios.com>
9 *
10 * Permission is hereby granted, free of charge, to any person obtaining a copy
11 * of this software and associated documentation files (the "Software"), to deal
12 * in the Software without restriction, including without limitation the rights
13 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14 * copies of the Software, and to permit persons to whom the Software is
15 * furnished to do so, subject to the following conditions:
16 *
17 * The above copyright notice and this permission notice shall be included in
18 * all copies or substantial portions of the Software.
19 *
20 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26 * SOFTWARE.
27 */
28
29#include <babeltrace/ctf-ir/event.h>
30#include <babeltrace/ctf-ir/packet.h>
31#include <babeltrace/ctf-ir/event-class.h>
32#include <babeltrace/ctf-ir/stream.h>
33#include <babeltrace/ctf-ir/stream-class.h>
34#include <babeltrace/ctf-ir/clock-class.h>
35#include <babeltrace/ctf-ir/fields.h>
36#include <babeltrace/ctf-writer/stream.h>
37#include <assert.h>
38
39#include "ctfcopytrace.h"
b2f1f465 40#include "clock-fields.h"
91b73004 41
9ac68eb1 42BT_HIDDEN
91b73004
JD
43struct bt_ctf_clock_class *ctf_copy_clock_class(FILE *err,
44 struct bt_ctf_clock_class *clock_class)
45{
46 int64_t offset, offset_s;
47 int int_ret;
48 uint64_t u64_ret;
49 const char *name, *description;
50 struct bt_ctf_clock_class *writer_clock_class = NULL;
51
52 assert(err && clock_class);
53
54 name = bt_ctf_clock_class_get_name(clock_class);
55 if (!name) {
56 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
57 __LINE__);
58 goto end;
59 }
60
61 writer_clock_class = bt_ctf_clock_class_create(name);
62 if (!writer_clock_class) {
63 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
64 __LINE__);
65 goto end;
66 }
67
68 description = bt_ctf_clock_class_get_description(clock_class);
16cd0c80
JD
69 if (description) {
70 int_ret = bt_ctf_clock_class_set_description(writer_clock_class,
71 description);
72 if (int_ret != 0) {
73 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
74 __LINE__);
75 goto end_destroy;
76 }
91b73004
JD
77 }
78
79 u64_ret = bt_ctf_clock_class_get_frequency(clock_class);
80 if (u64_ret == -1ULL) {
81 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
82 __LINE__);
83 goto end_destroy;
84 }
85 int_ret = bt_ctf_clock_class_set_frequency(writer_clock_class, u64_ret);
86 if (int_ret != 0) {
87 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
88 __LINE__);
89 goto end_destroy;
90 }
91
92 u64_ret = bt_ctf_clock_class_get_precision(clock_class);
93 if (u64_ret == -1ULL) {
94 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
95 __LINE__);
96 goto end_destroy;
97 }
98 int_ret = bt_ctf_clock_class_set_precision(writer_clock_class,
99 u64_ret);
100 if (int_ret != 0) {
101 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
102 __LINE__);
103 goto end_destroy;
104 }
105
106 int_ret = bt_ctf_clock_class_get_offset_s(clock_class, &offset_s);
107 if (int_ret != 0) {
108 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
109 __LINE__);
110 goto end_destroy;
111 }
112
113 int_ret = bt_ctf_clock_class_set_offset_s(writer_clock_class, offset_s);
114 if (int_ret != 0) {
115 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
116 __LINE__);
117 goto end_destroy;
118 }
119
120 int_ret = bt_ctf_clock_class_get_offset_cycles(clock_class, &offset);
121 if (int_ret != 0) {
122 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
123 __LINE__);
124 goto end_destroy;
125 }
126
127 int_ret = bt_ctf_clock_class_set_offset_cycles(writer_clock_class, offset);
128 if (int_ret != 0) {
129 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
130 __LINE__);
131 goto end_destroy;
132 }
133
acd6aeb1 134 int_ret = bt_ctf_clock_class_is_absolute(clock_class);
91b73004
JD
135 if (int_ret == -1) {
136 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
137 __LINE__);
138 goto end_destroy;
139 }
140
141 int_ret = bt_ctf_clock_class_set_is_absolute(writer_clock_class, int_ret);
142 if (int_ret != 0) {
143 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
144 __LINE__);
145 goto end_destroy;
146 }
147
148 goto end;
149
150end_destroy:
151 BT_PUT(writer_clock_class);
152end:
153 return writer_clock_class;
154}
155
9ac68eb1 156BT_HIDDEN
91b73004
JD
157enum bt_component_status ctf_copy_clock_classes(FILE *err,
158 struct bt_ctf_trace *writer_trace,
159 struct bt_ctf_stream_class *writer_stream_class,
160 struct bt_ctf_trace *trace)
161{
162 enum bt_component_status ret;
91b73004
JD
163 int int_ret, clock_class_count, i;
164
165 clock_class_count = bt_ctf_trace_get_clock_class_count(trace);
166
167 for (i = 0; i < clock_class_count; i++) {
168 struct bt_ctf_clock_class *writer_clock_class;
169 struct bt_ctf_clock_class *clock_class =
9ac68eb1 170 bt_ctf_trace_get_clock_class_by_index(trace, i);
91b73004
JD
171
172 if (!clock_class) {
173 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
174 __LINE__);
175 ret = BT_COMPONENT_STATUS_ERROR;
176 goto end;
177 }
178
179 writer_clock_class = ctf_copy_clock_class(err, clock_class);
180 bt_put(clock_class);
181 if (!writer_clock_class) {
182 fprintf(err, "Failed to copy clock class");
183 ret = BT_COMPONENT_STATUS_ERROR;
184 goto end;
185 }
186
187 int_ret = bt_ctf_trace_add_clock_class(writer_trace, writer_clock_class);
188 if (int_ret != 0) {
189 BT_PUT(writer_clock_class);
190 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
191 __LINE__);
192 ret = BT_COMPONENT_STATUS_ERROR;
193 goto end;
194 }
195
196 /*
b2f1f465 197 * Ownership transferred to the trace.
91b73004
JD
198 */
199 bt_put(writer_clock_class);
200 }
201
202 ret = BT_COMPONENT_STATUS_OK;
203
204end:
205 return ret;
206}
207
9ac68eb1 208BT_HIDDEN
91b73004
JD
209struct bt_ctf_event_class *ctf_copy_event_class(FILE *err,
210 struct bt_ctf_event_class *event_class)
211{
212 struct bt_ctf_event_class *writer_event_class = NULL;
f87fb9b4 213 struct bt_ctf_field_type *context, *payload_type;
91b73004 214 const char *name;
cf76ce92
PP
215 int ret;
216 int64_t id;
217 enum bt_ctf_event_class_log_level log_level;
218 const char *emf_uri;
91b73004
JD
219
220 name = bt_ctf_event_class_get_name(event_class);
221 if (!name) {
222 fprintf(err, "[error] %s in %s:%d\n", __func__,
223 __FILE__, __LINE__);
224 goto end;
225 }
226
227 writer_event_class = bt_ctf_event_class_create(name);
228 if (!writer_event_class) {
229 fprintf(err, "[error] %s in %s:%d\n", __func__,
230 __FILE__, __LINE__);
231 goto end;
232 }
233
cf76ce92
PP
234 id = bt_ctf_event_class_get_id(event_class);
235 if (id < 0) {
236 fprintf(err, "[error] %s in %s:%d\n", __func__,
237 __FILE__, __LINE__);
238 goto error;
239 }
91b73004 240
cf76ce92
PP
241 ret = bt_ctf_event_class_set_id(writer_event_class, id);
242 if (ret) {
243 fprintf(err, "[error] %s in %s:%d\n", __func__,
244 __FILE__, __LINE__);
245 goto error;
246 }
91b73004 247
cf76ce92
PP
248 log_level = bt_ctf_event_class_get_log_level(event_class);
249 if (log_level < 0) {
250 fprintf(err, "[error] %s in %s:%d\n", __func__,
251 __FILE__, __LINE__);
252 goto error;
253 }
254
255 ret = bt_ctf_event_class_set_log_level(writer_event_class, log_level);
256 if (ret) {
257 fprintf(err, "[error] %s in %s:%d\n", __func__,
258 __FILE__, __LINE__);
259 goto error;
260 }
261
262 emf_uri = bt_ctf_event_class_get_emf_uri(event_class);
263 if (emf_uri) {
264 ret = bt_ctf_event_class_set_emf_uri(writer_event_class,
265 emf_uri);
266 if (ret) {
91b73004
JD
267 fprintf(err, "[error] %s in %s:%d\n", __func__,
268 __FILE__, __LINE__);
9ae49d3d 269 goto error;
91b73004
JD
270 }
271 }
272
f87fb9b4
JD
273 payload_type = bt_ctf_event_class_get_payload_type(event_class);
274 if (payload_type) {
275 ret = bt_ctf_event_class_set_payload_type(writer_event_class,
276 payload_type);
91b73004 277 if (ret < 0) {
f87fb9b4
JD
278 fprintf(err, "[error] %s in %s:%d\n", __func__,
279 __FILE__, __LINE__);
9ae49d3d 280 goto error;
91b73004 281 }
f87fb9b4 282 BT_PUT(payload_type);
91b73004
JD
283 }
284
279c77d0
JD
285 context = bt_ctf_event_class_get_context_type(event_class);
286 if (context) {
287 ret = bt_ctf_event_class_set_context_type(
288 writer_event_class, context);
289 BT_PUT(context);
290 if (ret < 0) {
291 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
292 __LINE__);
293 goto error;
294 }
295 }
296
9ae49d3d
JD
297 goto end;
298
299error:
300 BT_PUT(writer_event_class);
91b73004
JD
301end:
302 return writer_event_class;
303}
304
9ac68eb1 305BT_HIDDEN
91b73004
JD
306enum bt_component_status ctf_copy_event_classes(FILE *err,
307 struct bt_ctf_stream_class *stream_class,
308 struct bt_ctf_stream_class *writer_stream_class)
309{
310 enum bt_component_status ret = BT_COMPONENT_STATUS_OK;
9ae49d3d 311 struct bt_ctf_event_class *event_class = NULL, *writer_event_class = NULL;
91b73004
JD
312 int count, i;
313
314 count = bt_ctf_stream_class_get_event_class_count(stream_class);
315 if (count < 0) {
316 fprintf(err, "[error] %s in %s:%d\n", __func__,
317 __FILE__, __LINE__);
318 goto end;
319 }
320
321 for (i = 0; i < count; i++) {
91b73004
JD
322 int int_ret;
323
9ac68eb1 324 event_class = bt_ctf_stream_class_get_event_class_by_index(
91b73004
JD
325 stream_class, i);
326 if (!event_class) {
327 fprintf(err, "[error] %s in %s:%d\n", __func__,
328 __FILE__, __LINE__);
329 ret = BT_COMPONENT_STATUS_ERROR;
9ae49d3d 330 goto error;
91b73004 331 }
cb0a5cf8
JD
332 if (i < bt_ctf_stream_class_get_event_class_count(writer_stream_class)) {
333 writer_event_class = bt_ctf_stream_class_get_event_class_by_index(
334 writer_stream_class, i);
335 if (writer_event_class) {
336 /*
337 * If the writer_event_class already exists,
338 * just skip it. It can be used to resync the
339 * event_classes after a trace has become
340 * static.
341 */
342 BT_PUT(writer_event_class);
343 BT_PUT(event_class);
344 continue;
345 }
346 }
347
91b73004
JD
348 writer_event_class = ctf_copy_event_class(err, event_class);
349 if (!writer_event_class) {
350 fprintf(err, "[error] %s in %s:%d\n", __func__,
351 __FILE__, __LINE__);
352 ret = BT_COMPONENT_STATUS_ERROR;
9ae49d3d 353 goto error;
91b73004
JD
354 }
355
91b73004
JD
356 int_ret = bt_ctf_stream_class_add_event_class(writer_stream_class,
357 writer_event_class);
358 if (int_ret < 0) {
359 fprintf(err, "[error] Failed to add event class\n");
360 fprintf(err, "[error] %s in %s:%d\n", __func__,
361 __FILE__, __LINE__);
362 ret = BT_COMPONENT_STATUS_ERROR;
9ae49d3d 363 goto error;
91b73004 364 }
9ae49d3d
JD
365 BT_PUT(writer_event_class);
366 BT_PUT(event_class);
91b73004
JD
367 }
368
9ae49d3d
JD
369 goto end;
370
371error:
372 bt_put(event_class);
373 bt_put(writer_event_class);
91b73004
JD
374end:
375 return ret;
376}
377
9ac68eb1 378BT_HIDDEN
91b73004 379struct bt_ctf_stream_class *ctf_copy_stream_class(FILE *err,
b2f1f465
JD
380 struct bt_ctf_stream_class *stream_class,
381 struct bt_ctf_trace *writer_trace,
382 bool override_ts64)
91b73004 383{
9ae49d3d
JD
384 struct bt_ctf_field_type *type = NULL;
385 struct bt_ctf_stream_class *writer_stream_class = NULL;
91b73004
JD
386 int ret_int;
387 const char *name = bt_ctf_stream_class_get_name(stream_class);
388
389 if (strlen(name) == 0) {
390 name = NULL;
391 }
392
e49da5dd 393 writer_stream_class = bt_ctf_stream_class_create_empty(name);
91b73004
JD
394 if (!writer_stream_class) {
395 fprintf(err, "[error] %s in %s:%d\n",
396 __func__, __FILE__, __LINE__);
397 goto end;
398 }
399
400 type = bt_ctf_stream_class_get_packet_context_type(stream_class);
401 if (!type) {
402 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
403 __LINE__);
404 goto error;
405 }
406
407 ret_int = bt_ctf_stream_class_set_packet_context_type(
408 writer_stream_class, type);
91b73004
JD
409 if (ret_int < 0) {
410 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
411 __LINE__);
412 goto error;
413 }
9ae49d3d 414 BT_PUT(type);
91b73004
JD
415
416 type = bt_ctf_stream_class_get_event_header_type(stream_class);
417 if (!type) {
418 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
419 __LINE__);
420 goto error;
421 }
422
b2f1f465 423 if (override_ts64) {
9ae49d3d
JD
424 struct bt_ctf_field_type *new_event_header_type;
425
b2f1f465
JD
426 new_event_header_type = override_header_type(err, type,
427 writer_trace);
b2f1f465
JD
428 if (!new_event_header_type) {
429 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
430 __LINE__);
431 goto error;
432 }
0f29db56
JD
433 ret_int = bt_ctf_stream_class_set_event_header_type(
434 writer_stream_class, new_event_header_type);
9ae49d3d 435 BT_PUT(new_event_header_type);
0f29db56
JD
436 if (ret_int < 0) {
437 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
438 __LINE__);
439 goto error;
440 }
b2f1f465 441 } else {
0f29db56
JD
442 ret_int = bt_ctf_stream_class_set_event_header_type(
443 writer_stream_class, type);
0f29db56
JD
444 if (ret_int < 0) {
445 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
446 __LINE__);
447 goto error;
448 }
91b73004 449 }
9ae49d3d 450 BT_PUT(type);
91b73004
JD
451
452 type = bt_ctf_stream_class_get_event_context_type(stream_class);
453 if (type) {
454 ret_int = bt_ctf_stream_class_set_event_context_type(
455 writer_stream_class, type);
91b73004
JD
456 if (ret_int < 0) {
457 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
458 __LINE__);
459 goto error;
460 }
461 }
9ae49d3d 462 BT_PUT(type);
91b73004
JD
463
464 goto end;
465
466error:
467 BT_PUT(writer_stream_class);
468end:
9ae49d3d 469 bt_put(type);
91b73004
JD
470 return writer_stream_class;
471}
472
9ac68eb1 473BT_HIDDEN
91b73004
JD
474enum bt_component_status ctf_copy_packet_context_field(FILE *err,
475 struct bt_ctf_field *field, const char *field_name,
476 struct bt_ctf_field *writer_packet_context,
477 struct bt_ctf_field_type *writer_packet_context_type)
478{
479 enum bt_component_status ret;
9ae49d3d
JD
480 struct bt_ctf_field *writer_field = NULL;
481 struct bt_ctf_field_type *field_type = NULL;
91b73004
JD
482 int int_ret;
483 uint64_t value;
484
485 field_type = bt_ctf_field_get_type(field);
486 if (!field_type) {
487 ret = BT_COMPONENT_STATUS_ERROR;
488 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
489 __LINE__);
490 goto end;
491 }
492 /*
493 * Only support for integers for now.
494 */
1487a16a 495 if (bt_ctf_field_type_get_type_id(field_type) != BT_CTF_FIELD_TYPE_ID_INTEGER) {
91b73004 496 fprintf(err, "[error] Unsupported packet context field type\n");
91b73004 497 ret = BT_COMPONENT_STATUS_ERROR;
9ae49d3d 498 goto error;
91b73004 499 }
9ae49d3d 500 BT_PUT(field_type);
91b73004 501
9ac68eb1
PP
502 writer_field = bt_ctf_field_structure_get_field_by_name(
503 writer_packet_context, field_name);
91b73004
JD
504 if (!writer_field) {
505 ret = BT_COMPONENT_STATUS_ERROR;
506 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
507 __LINE__);
508 goto end;
509 }
510
91b73004
JD
511 int_ret = bt_ctf_field_unsigned_integer_get_value(field, &value);
512 if (int_ret < 0) {
513 fprintf(err, "[error] Wrong packet_context field type\n");
514 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
515 __LINE__);
516 ret = BT_COMPONENT_STATUS_ERROR;
9ae49d3d 517 goto end;
91b73004
JD
518 }
519
520 int_ret = bt_ctf_field_unsigned_integer_set_value(writer_field, value);
521 if (int_ret < 0) {
522 ret = BT_COMPONENT_STATUS_ERROR;
523 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
524 __LINE__);
9ae49d3d 525 goto end;
91b73004
JD
526 }
527
528 ret = BT_COMPONENT_STATUS_OK;
529
9ae49d3d
JD
530 goto end;
531
532error:
533 bt_put(field_type);
91b73004 534end:
9ae49d3d 535 bt_put(writer_field);
91b73004
JD
536 return ret;
537}
538
9ac68eb1 539BT_HIDDEN
b2f1f465 540struct bt_ctf_field *ctf_copy_packet_context(FILE *err,
91b73004 541 struct bt_ctf_packet *packet,
79697a58 542 struct bt_ctf_stream *writer_stream)
91b73004
JD
543{
544 enum bt_component_status ret;
9ae49d3d
JD
545 struct bt_ctf_field *packet_context = NULL, *writer_packet_context = NULL;
546 struct bt_ctf_field_type *struct_type = NULL, *writer_packet_context_type = NULL;
547 struct bt_ctf_stream_class *writer_stream_class = NULL;
f6f999a3 548 struct bt_ctf_field *field = NULL;
9571c709 549 struct bt_ctf_field_type *field_type = NULL;
b2f1f465 550 int nr_fields, i;
91b73004
JD
551
552 packet_context = bt_ctf_packet_get_context(packet);
553 if (!packet_context) {
60ef553b 554 goto end;
91b73004
JD
555 }
556
557 writer_stream_class = bt_ctf_stream_get_class(writer_stream);
558 if (!writer_stream_class) {
91b73004
JD
559 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
560 __LINE__);
9ae49d3d 561 goto error;
91b73004
JD
562 }
563
564 writer_packet_context_type = bt_ctf_stream_class_get_packet_context_type(
565 writer_stream_class);
9ae49d3d 566 BT_PUT(writer_stream_class);
91b73004 567 if (!writer_packet_context_type) {
91b73004
JD
568 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
569 __LINE__);
9ae49d3d 570 goto error;
91b73004
JD
571 }
572
573 struct_type = bt_ctf_field_get_type(packet_context);
574 if (!struct_type) {
91b73004
JD
575 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
576 __LINE__);
9ae49d3d 577 goto error;
91b73004
JD
578 }
579
580 writer_packet_context = bt_ctf_field_create(writer_packet_context_type);
581 if (!writer_packet_context) {
91b73004
JD
582 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
583 __LINE__);
9ae49d3d 584 goto error;
91b73004
JD
585 }
586
587 nr_fields = bt_ctf_field_type_structure_get_field_count(struct_type);
588 for (i = 0; i < nr_fields; i++) {
91b73004
JD
589 const char *field_name;
590
0f29db56 591 field = bt_ctf_field_structure_get_field_by_index(
91b73004
JD
592 packet_context, i);
593 if (!field) {
91b73004
JD
594 fprintf(err, "[error] %s in %s:%d\n", __func__,
595 __FILE__, __LINE__);
9ae49d3d 596 goto error;
91b73004 597 }
9ac68eb1 598 if (bt_ctf_field_type_structure_get_field_by_index(struct_type,
91b73004 599 &field_name, &field_type, i) < 0) {
91b73004
JD
600 fprintf(err, "[error] %s in %s:%d\n", __func__,
601 __FILE__, __LINE__);
9ae49d3d 602 goto error;
91b73004 603 }
91b73004 604
1487a16a 605 if (bt_ctf_field_type_get_type_id(field_type) != BT_CTF_FIELD_TYPE_ID_INTEGER) {
91b73004 606 fprintf(err, "[error] Unexpected packet context field type\n");
9ae49d3d 607 goto error;
91b73004
JD
608 }
609
610 ret = ctf_copy_packet_context_field(err, field, field_name,
611 writer_packet_context, writer_packet_context_type);
9ae49d3d
JD
612 BT_PUT(field_type);
613 BT_PUT(field);
91b73004
JD
614 if (ret != BT_COMPONENT_STATUS_OK) {
615 fprintf(err, "[error] %s in %s:%d\n", __func__,
616 __FILE__, __LINE__);
9ae49d3d 617 goto error;
91b73004
JD
618 }
619 }
620
9ae49d3d
JD
621 goto end;
622
623error:
624 BT_PUT(writer_packet_context);
625end:
626 bt_put(field);
627 bt_put(field_type);
91b73004 628 bt_put(struct_type);
91b73004 629 bt_put(writer_packet_context_type);
91b73004 630 bt_put(writer_stream_class);
91b73004 631 bt_put(packet_context);
b2f1f465
JD
632 return writer_packet_context;
633}
634
9ac68eb1 635BT_HIDDEN
0f29db56 636int ctf_copy_event_header(FILE *err, struct bt_ctf_event *event,
b2f1f465
JD
637 struct bt_ctf_event_class *writer_event_class,
638 struct bt_ctf_event *writer_event,
639 struct bt_ctf_field *event_header)
640{
9ae49d3d
JD
641 struct bt_ctf_clock_class *clock_class = NULL, *writer_clock_class = NULL;
642 struct bt_ctf_clock_value *clock_value = NULL, *writer_clock_value = NULL;
b2f1f465
JD
643
644 int ret;
0f29db56
JD
645 struct bt_ctf_field *writer_event_header = NULL;
646 uint64_t value;
b2f1f465 647
0f29db56
JD
648 clock_class = event_get_clock_class(err, event);
649 if (!clock_class) {
650 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
651 __LINE__);
652 goto error;
653 }
654
655 clock_value = bt_ctf_event_get_clock_value(event, clock_class);
9ae49d3d 656 BT_PUT(clock_class);
0f29db56
JD
657 if (!clock_value) {
658 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
659 __LINE__);
660 goto error;
661 }
662
663 ret = bt_ctf_clock_value_get_value(clock_value, &value);
9ae49d3d 664 BT_PUT(clock_value);
0f29db56
JD
665 if (ret) {
666 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
667 __LINE__);
668 goto error;
b2f1f465
JD
669 }
670
671 writer_clock_class = event_get_clock_class(err, writer_event);
672 if (!writer_clock_class) {
673 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
674 __LINE__);
675 goto error;
676 }
677
0f29db56 678 writer_clock_value = bt_ctf_clock_value_create(writer_clock_class, value);
9ae49d3d 679 BT_PUT(writer_clock_class);
0f29db56 680 if (!writer_clock_value) {
b2f1f465
JD
681 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
682 __LINE__);
9ae49d3d 683 goto error;
b2f1f465
JD
684 }
685
0f29db56 686 ret = bt_ctf_event_set_clock_value(writer_event, writer_clock_value);
9ae49d3d 687 BT_PUT(writer_clock_value);
b2f1f465
JD
688 if (ret) {
689 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
690 __LINE__);
691 goto error;
692 }
693
0f29db56
JD
694 writer_event_header = bt_ctf_field_copy(event_header);
695 if (!writer_event_header) {
696 fprintf(err, "[error] %s in %s:%d\n", __func__,
697 __FILE__, __LINE__);
0f29db56
JD
698 goto end;
699 }
700
b2f1f465 701 ret = bt_ctf_event_set_header(writer_event, writer_event_header);
9ae49d3d 702 BT_PUT(writer_event_header);
b2f1f465
JD
703 if (ret < 0) {
704 fprintf(err, "[error] %s in %s:%d\n", __func__,
705 __FILE__, __LINE__);
706 goto error;
707 }
b2f1f465
JD
708
709 ret = 0;
710
711 goto end;
712
713error:
b2f1f465 714 ret = -1;
91b73004
JD
715end:
716 return ret;
717}
718
9ac68eb1 719BT_HIDDEN
91b73004 720struct bt_ctf_event *ctf_copy_event(FILE *err, struct bt_ctf_event *event,
b2f1f465
JD
721 struct bt_ctf_event_class *writer_event_class,
722 bool override_ts64)
91b73004 723{
9ae49d3d
JD
724 struct bt_ctf_event *writer_event = NULL;
725 struct bt_ctf_field *field = NULL, *copy_field = NULL;
91b73004
JD
726 int ret;
727
728 writer_event = bt_ctf_event_create(writer_event_class);
729 if (!writer_event) {
730 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
731 __LINE__);
732 goto end;
733 }
734
735 field = bt_ctf_event_get_header(event);
736 if (!field) {
91b73004
JD
737 fprintf(err, "[error] %s in %s:%d\n", __func__,
738 __FILE__, __LINE__);
9ae49d3d 739 goto error;
91b73004
JD
740 }
741
b2f1f465
JD
742 /*
743 * If override_ts64, we override all integer fields mapped to a clock
744 * to a uint64_t field type, otherwise, we just copy it as is.
745 */
746 if (override_ts64) {
747 copy_field = bt_ctf_event_get_header(writer_event);
748 if (!copy_field) {
91b73004
JD
749 fprintf(err, "[error] %s in %s:%d\n", __func__,
750 __FILE__, __LINE__);
9ae49d3d 751 goto error;
b2f1f465
JD
752 }
753
754 ret = copy_override_field(err, event, writer_event, field,
755 copy_field);
b2f1f465 756 if (ret) {
b2f1f465
JD
757 fprintf(err, "[error] %s in %s:%d\n", __func__,
758 __FILE__, __LINE__);
9ae49d3d 759 goto error;
b2f1f465 760 }
9ae49d3d 761 BT_PUT(copy_field);
b2f1f465 762 } else {
0f29db56 763 ret = ctf_copy_event_header(err, event, writer_event_class,
b2f1f465
JD
764 writer_event, field);
765 if (ret) {
b2f1f465
JD
766 fprintf(err, "[error] %s in %s:%d\n", __func__,
767 __FILE__, __LINE__);
9ae49d3d 768 goto error;
91b73004 769 }
91b73004 770 }
9ae49d3d 771 BT_PUT(field);
91b73004
JD
772
773 /* Optional field, so it can fail silently. */
774 field = bt_ctf_event_get_stream_event_context(event);
961ec227
JD
775 if (field) {
776 copy_field = bt_ctf_field_copy(field);
777 if (!copy_field) {
778 fprintf(err, "[error] %s in %s:%d\n", __func__,
779 __FILE__, __LINE__);
780 goto error;
781 }
91b73004
JD
782 ret = bt_ctf_event_set_stream_event_context(writer_event,
783 copy_field);
91b73004
JD
784 if (ret < 0) {
785 fprintf(err, "[error] %s in %s:%d\n", __func__,
786 __FILE__, __LINE__);
787 goto error;
788 }
961ec227
JD
789 BT_PUT(field);
790 BT_PUT(copy_field);
91b73004
JD
791 }
792
793 /* Optional field, so it can fail silently. */
794 field = bt_ctf_event_get_event_context(event);
961ec227
JD
795 if (field) {
796 copy_field = bt_ctf_field_copy(field);
797 if (!copy_field) {
798 fprintf(err, "[error] %s in %s:%d\n", __func__,
799 __FILE__, __LINE__);
800 goto error;
801 }
91b73004 802 ret = bt_ctf_event_set_event_context(writer_event, copy_field);
91b73004
JD
803 if (ret < 0) {
804 fprintf(err, "[error] %s in %s:%d\n", __func__,
805 __FILE__, __LINE__);
806 goto error;
807 }
961ec227
JD
808 BT_PUT(field);
809 BT_PUT(copy_field);
91b73004
JD
810 }
811
9ac68eb1 812 field = bt_ctf_event_get_event_payload(event);
961ec227
JD
813 if (field) {
814 copy_field = bt_ctf_field_copy(field);
815 if (!copy_field) {
816 fprintf(err, "[error] %s in %s:%d\n", __func__,
817 __FILE__, __LINE__);
818 goto error;
819 }
9ac68eb1 820 ret = bt_ctf_event_set_event_payload(writer_event, copy_field);
91b73004
JD
821 if (ret < 0) {
822 fprintf(err, "[error] %s in %s:%d\n", __func__,
823 __FILE__, __LINE__);
824 goto error;
825 }
961ec227
JD
826 BT_PUT(field);
827 BT_PUT(copy_field);
91b73004 828 }
9ae49d3d 829
91b73004
JD
830 goto end;
831
832error:
833 BT_PUT(writer_event);
834end:
9ae49d3d
JD
835 bt_put(field);
836 bt_put(copy_field);
91b73004
JD
837 return writer_event;
838}
839
9ac68eb1 840BT_HIDDEN
91b73004
JD
841enum bt_component_status ctf_copy_trace(FILE *err, struct bt_ctf_trace *trace,
842 struct bt_ctf_trace *writer_trace)
843{
844 enum bt_component_status ret = BT_COMPONENT_STATUS_OK;
845 int field_count, i, int_ret;
9ae49d3d 846 struct bt_ctf_field_type *header_type = NULL;
6468dbd6 847 enum bt_ctf_byte_order order;
0ac862b4 848 const char *trace_name;
91b73004
JD
849
850 field_count = bt_ctf_trace_get_environment_field_count(trace);
851 for (i = 0; i < field_count; i++) {
852 int ret_int;
853 const char *name;
9ae49d3d 854 struct bt_value *value = NULL;
91b73004 855
9ac68eb1
PP
856 name = bt_ctf_trace_get_environment_field_name_by_index(
857 trace, i);
91b73004
JD
858 if (!name) {
859 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
860 __LINE__);
861 ret = BT_COMPONENT_STATUS_ERROR;
9ae49d3d 862 goto end;
91b73004 863 }
9ac68eb1
PP
864 value = bt_ctf_trace_get_environment_field_value_by_index(
865 trace, i);
91b73004
JD
866 if (!value) {
867 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
868 __LINE__);
869 ret = BT_COMPONENT_STATUS_ERROR;
9ae49d3d 870 goto end;
91b73004
JD
871 }
872
873 ret_int = bt_ctf_trace_set_environment_field(writer_trace,
874 name, value);
9ae49d3d 875 BT_PUT(value);
91b73004
JD
876 if (ret_int < 0) {
877 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__,
878 __LINE__);
879 fprintf(err, "[error] Unable to set environment field %s\n",
880 name);
881 ret = BT_COMPONENT_STATUS_ERROR;
9ae49d3d 882 goto end;
91b73004
JD
883 }
884 }
885
6468dbd6
JD
886 order = bt_ctf_trace_get_native_byte_order(trace);
887 if (order == BT_CTF_BYTE_ORDER_UNKNOWN) {
888 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__, __LINE__);
889 ret = BT_COMPONENT_STATUS_ERROR;
890 goto end;
891 }
892
d41cff38
PP
893 /*
894 * Only explicitly set the writer trace's native byte order if
895 * the original trace has a specific one. Otherwise leave what
896 * the CTF writer object chooses, which is the machine's native
897 * byte order.
898 */
2f4b93cd 899 if (order != BT_CTF_BYTE_ORDER_UNSPECIFIED) {
d41cff38
PP
900 ret = bt_ctf_trace_set_native_byte_order(writer_trace, order);
901 if (ret) {
902 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__, __LINE__);
903 ret = BT_COMPONENT_STATUS_ERROR;
904 goto end;
905 }
6468dbd6
JD
906 }
907
91b73004 908 header_type = bt_ctf_trace_get_packet_header_type(writer_trace);
944eed39
JD
909 if (header_type) {
910 int_ret = bt_ctf_trace_set_packet_header_type(writer_trace, header_type);
911 BT_PUT(header_type);
912 if (int_ret < 0) {
913 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__, __LINE__);
914 ret = BT_COMPONENT_STATUS_ERROR;
915 goto end;
916 }
91b73004
JD
917 }
918
0ac862b4
JD
919 trace_name = bt_ctf_trace_get_name(trace);
920 if (trace_name) {
921 int_ret = bt_ctf_trace_set_name(writer_trace, trace_name);
922 if (int_ret < 0) {
923 fprintf(err, "[error] %s in %s:%d\n", __func__, __FILE__, __LINE__);
924 ret = BT_COMPONENT_STATUS_ERROR;
925 goto end;
926 }
927 }
928
9ae49d3d 929end:
91b73004
JD
930 return ret;
931}
This page took 0.068344 seconds and 4 git commands to generate.