2 * SPDX-License-Identifier: MIT
4 * Copyright 2016 Philippe Proulx <pproulx@efficios.com>
5 * Copyright 2010-2011 EfficiOS Inc. and Linux Foundation
8 #define BT_COMP_LOG_SELF_COMP self_comp
9 #define BT_LOG_OUTPUT_LEVEL log_level
10 #define BT_LOG_TAG "PLUGIN/SRC.CTF.FS/META"
11 #include "logging/comp-logging.h"
16 #include "common/assert.h"
18 #include "common/uuid.h"
19 #include "compat/memstream.h"
20 #include <babeltrace2/babeltrace.h>
24 #include "metadata.hpp"
25 #include "../common/metadata/decoder.hpp"
27 FILE *ctf_fs_metadata_open_file(const char *trace_path
, bt_logging_level log_level
,
28 bt_self_component_class
*comp_class
)
30 GString
*metadata_path
;
33 metadata_path
= g_string_new(trace_path
);
38 g_string_append(metadata_path
, G_DIR_SEPARATOR_S CTF_FS_METADATA_FILENAME
);
39 fp
= fopen(metadata_path
->str
, "rb");
41 BT_COMP_CLASS_LOGE_APPEND_CAUSE_ERRNO(comp_class
, "Failed to open metadata file",
42 ": path=\"%s\"", metadata_path
->str
);
45 g_string_free(metadata_path
, TRUE
);
51 static struct ctf_fs_file
*get_file(const char *trace_path
, bt_logging_level log_level
,
52 bt_self_component
*self_comp
)
54 struct ctf_fs_file
*file
= ctf_fs_file_create(log_level
, self_comp
);
60 g_string_append(file
->path
, trace_path
);
61 g_string_append(file
->path
, G_DIR_SEPARATOR_S CTF_FS_METADATA_FILENAME
);
63 if (ctf_fs_file_open(file
, "rb")) {
71 ctf_fs_file_destroy(file
);
79 int ctf_fs_metadata_set_trace_class(bt_self_component
*self_comp
, struct ctf_fs_trace
*ctf_fs_trace
,
80 struct ctf_fs_metadata_config
*config
)
83 struct ctf_fs_file
*file
= NULL
;
84 bt_logging_level log_level
= ctf_fs_trace
->log_level
;
86 ctf_metadata_decoder_config decoder_config
{};
87 decoder_config
.log_level
= ctf_fs_trace
->log_level
, decoder_config
.self_comp
= self_comp
,
88 decoder_config
.clock_class_offset_s
= config
? config
->clock_class_offset_s
: 0,
89 decoder_config
.clock_class_offset_ns
= config
? config
->clock_class_offset_ns
: 0,
90 decoder_config
.force_clock_class_origin_unix_epoch
=
91 config
? config
->force_clock_class_origin_unix_epoch
: false,
92 decoder_config
.create_trace_class
= true,
94 file
= get_file(ctf_fs_trace
->path
->str
, log_level
, self_comp
);
96 BT_COMP_LOGE("Cannot create metadata file object.");
101 ctf_fs_trace
->metadata
->decoder
= ctf_metadata_decoder_create(&decoder_config
);
102 if (!ctf_fs_trace
->metadata
->decoder
) {
103 BT_COMP_LOGE("Cannot create metadata decoder object.");
108 ret
= ctf_metadata_decoder_append_content(ctf_fs_trace
->metadata
->decoder
, file
->fp
);
110 BT_COMP_LOGE("Cannot update metadata decoder's content.");
114 ctf_fs_trace
->metadata
->trace_class
=
115 ctf_metadata_decoder_get_ir_trace_class(ctf_fs_trace
->metadata
->decoder
);
116 BT_ASSERT(!self_comp
|| ctf_fs_trace
->metadata
->trace_class
);
117 ctf_fs_trace
->metadata
->tc
=
118 ctf_metadata_decoder_borrow_ctf_trace_class(ctf_fs_trace
->metadata
->decoder
);
119 BT_ASSERT(ctf_fs_trace
->metadata
->tc
);
122 ctf_fs_file_destroy(file
);
126 int ctf_fs_metadata_init(struct ctf_fs_metadata
*)
128 /* Nothing to initialize for the moment. */
132 void ctf_fs_metadata_fini(struct ctf_fs_metadata
*metadata
)
134 free(metadata
->text
);
136 if (metadata
->trace_class
) {
137 BT_TRACE_CLASS_PUT_REF_AND_RESET(metadata
->trace_class
);
140 if (metadata
->decoder
) {
141 ctf_metadata_decoder_destroy(metadata
->decoder
);