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_CLOG_CFG logCfg
9 #define BT_LOG_TAG "PLUGIN/SRC.CTF.FS/META"
14 #include "common/assert.h"
16 #include "common/uuid.h"
17 #include "compat/memstream.h"
18 #include <babeltrace2/babeltrace.h>
22 #include "metadata.hpp"
23 #include "../common/src/metadata/tsdl/decoder.hpp"
24 #include "cpp-common/cfg-logging.hpp"
27 FILE *ctf_fs_metadata_open_file(const char *trace_path
)
29 GString
*metadata_path
;
32 metadata_path
= g_string_new(trace_path
);
37 g_string_append(metadata_path
, G_DIR_SEPARATOR_S CTF_FS_METADATA_FILENAME
);
38 fp
= fopen(metadata_path
->str
, "rb");
39 g_string_free(metadata_path
, TRUE
);
44 static struct ctf_fs_file
*get_file(const char *trace_path
, const bt2_common::LogCfg
& logCfg
)
46 struct ctf_fs_file
*file
= ctf_fs_file_create(logCfg
);
52 g_string_append(file
->path
, trace_path
);
53 g_string_append(file
->path
, G_DIR_SEPARATOR_S CTF_FS_METADATA_FILENAME
);
55 if (ctf_fs_file_open(file
, "rb")) {
63 ctf_fs_file_destroy(file
);
72 int ctf_fs_metadata_set_trace_class(struct ctf_fs_trace
*ctf_fs_trace
,
73 struct ctf_fs_metadata_config
*config
,
74 bt_self_component
*selfComp
, const bt2_common::LogCfg
& logCfg
)
77 struct ctf_fs_file
*file
= NULL
;
79 ctf_metadata_decoder_config
decoder_config(logCfg
);
80 decoder_config
.clock_class_offset_s
= config
? config
->clock_class_offset_s
: 0;
81 decoder_config
.clock_class_offset_ns
= config
? config
->clock_class_offset_ns
: 0;
82 decoder_config
.force_clock_class_origin_unix_epoch
=
83 config
? config
->force_clock_class_origin_unix_epoch
: false;
84 decoder_config
.create_trace_class
= true;
85 decoder_config
.self_comp
= selfComp
;
87 file
= get_file(ctf_fs_trace
->path
->str
, logCfg
);
89 BT_CLOGE("Cannot create metadata file object.");
94 ctf_fs_trace
->metadata
->decoder
= ctf_metadata_decoder_create(&decoder_config
);
95 if (!ctf_fs_trace
->metadata
->decoder
) {
96 BT_CLOGE("Cannot create metadata decoder object.");
101 ret
= ctf_metadata_decoder_append_content(ctf_fs_trace
->metadata
->decoder
.get(), file
->fp
);
103 BT_CLOGE("Cannot update metadata decoder's content.");
107 ctf_fs_trace
->metadata
->trace_class
=
108 ctf_metadata_decoder_get_ir_trace_class(ctf_fs_trace
->metadata
->decoder
.get());
109 ctf_fs_trace
->metadata
->tc
=
110 ctf_metadata_decoder_borrow_ctf_trace_class(ctf_fs_trace
->metadata
->decoder
.get());
111 BT_ASSERT(ctf_fs_trace
->metadata
->tc
);
114 ctf_fs_file_destroy(file
);
119 int ctf_fs_metadata_init(struct ctf_fs_metadata
*metadata
)
121 /* Nothing to initialize for the moment. */
126 void ctf_fs_metadata_fini(struct ctf_fs_metadata
*metadata
)
128 free(metadata
->text
);
130 if (metadata
->trace_class
) {
131 BT_TRACE_CLASS_PUT_REF_AND_RESET(metadata
->trace_class
);
134 metadata
->decoder
.reset();