From: Simon Marchi Date: Tue, 26 Jul 2022 20:58:53 +0000 (-0400) Subject: ctf: use unique_ptr to manage ctf_visitor_generate_ir lifetime X-Git-Url: http://git.efficios.com/?a=commitdiff_plain;h=3bdd25dd90c1a4ffa43256314e8fc2bf1967cf34;p=deliverable%2Fbabeltrace.git ctf: use unique_ptr to manage ctf_visitor_generate_ir lifetime Define ctf_visitor_generate_ir::UP as a unique_ptr type with a custome deleter that calls ctf_visitor_generate_ir_destroy. Make ctf_visitor_generate_ir_create return a ctf_visitor_generate_ir::UP and adjust relevant callers / callees. Change-Id: I9db22bd66e69473e67c2571e0b2bb7682863cff7 Signed-off-by: Simon Marchi Reviewed-on: https://review.lttng.org/c/babeltrace/+/8163 Reviewed-by: Philippe Proulx --- diff --git a/src/plugins/ctf/common/src/metadata/tsdl/ast.hpp b/src/plugins/ctf/common/src/metadata/tsdl/ast.hpp index 5d80c6eb0..bb9cb5fb9 100644 --- a/src/plugins/ctf/common/src/metadata/tsdl/ast.hpp +++ b/src/plugins/ctf/common/src/metadata/tsdl/ast.hpp @@ -7,6 +7,7 @@ #ifndef _CTF_AST_H #define _CTF_AST_H +#include #include #include #include @@ -351,8 +352,15 @@ struct ctf_ast const char *node_type(struct ctf_node *node); +struct ctf_visitor_generate_ir_deleter +{ + void operator()(struct ctf_visitor_generate_ir *visitor); +}; + struct ctf_visitor_generate_ir { + using UP = std::unique_ptr; + explicit ctf_visitor_generate_ir(const ctf_metadata_decoder_config& decoderConfig) noexcept : decoder_config {decoderConfig} { @@ -378,11 +386,9 @@ struct ctf_visitor_generate_ir }; BT_HIDDEN -struct ctf_visitor_generate_ir * +ctf_visitor_generate_ir::UP ctf_visitor_generate_ir_create(const struct ctf_metadata_decoder_config *config); -void ctf_visitor_generate_ir_destroy(struct ctf_visitor_generate_ir *visitor); - BT_HIDDEN bt_trace_class *ctf_visitor_generate_ir_get_ir_trace_class(struct ctf_visitor_generate_ir *visitor); diff --git a/src/plugins/ctf/common/src/metadata/tsdl/decoder.cpp b/src/plugins/ctf/common/src/metadata/tsdl/decoder.cpp index f6849dd52..769adabd2 100644 --- a/src/plugins/ctf/common/src/metadata/tsdl/decoder.cpp +++ b/src/plugins/ctf/common/src/metadata/tsdl/decoder.cpp @@ -37,7 +37,7 @@ struct ctf_metadata_decoder struct ctf_scanner *scanner = nullptr; GString *text = nullptr; - struct ctf_visitor_generate_ir *visitor = nullptr; + ctf_visitor_generate_ir::UP visitor; bt_uuid_t uuid {}; bool is_uuid_set = false; int bo = 0; @@ -161,7 +161,6 @@ void ctf_metadata_decoder_destroy(struct ctf_metadata_decoder *mdec) } BT_CLOGD("Destroying CTF metadata decoder: addr=%p", mdec); - ctf_visitor_generate_ir_destroy(mdec->visitor); delete mdec; } @@ -305,7 +304,7 @@ ctf_metadata_decoder_append_content(struct ctf_metadata_decoder *mdec, FILE *fp) } if (mdec->config.create_trace_class) { - ret = ctf_visitor_generate_ir_visit_node(mdec->visitor, &mdec->scanner->ast->root); + ret = ctf_visitor_generate_ir_visit_node(mdec->visitor.get(), &mdec->scanner->ast->root); switch (ret) { case 0: /* Success */ @@ -348,7 +347,7 @@ bt_trace_class *ctf_metadata_decoder_get_ir_trace_class(struct ctf_metadata_deco { BT_ASSERT_DBG(mdec); BT_ASSERT_DBG(mdec->config.create_trace_class); - return ctf_visitor_generate_ir_get_ir_trace_class(mdec->visitor); + return ctf_visitor_generate_ir_get_ir_trace_class(mdec->visitor.get()); } BT_HIDDEN @@ -357,7 +356,7 @@ ctf_metadata_decoder_borrow_ctf_trace_class(struct ctf_metadata_decoder *mdec) { BT_ASSERT_DBG(mdec); BT_ASSERT_DBG(mdec->config.create_trace_class); - return ctf_visitor_generate_ir_borrow_ctf_trace_class(mdec->visitor); + return ctf_visitor_generate_ir_borrow_ctf_trace_class(mdec->visitor.get()); } BT_HIDDEN diff --git a/src/plugins/ctf/common/src/metadata/tsdl/visitor-generate-ir.cpp b/src/plugins/ctf/common/src/metadata/tsdl/visitor-generate-ir.cpp index 859252537..8f48b9b24 100644 --- a/src/plugins/ctf/common/src/metadata/tsdl/visitor-generate-ir.cpp +++ b/src/plugins/ctf/common/src/metadata/tsdl/visitor-generate-ir.cpp @@ -519,12 +519,12 @@ end: * @param trace Associated trace * @returns New visitor context, or NULL on error */ -static struct ctf_visitor_generate_ir * +static ctf_visitor_generate_ir::UP ctx_create(const struct ctf_metadata_decoder_config *decoder_config) { BT_ASSERT(decoder_config); - ctf_visitor_generate_ir *ctx = new ctf_visitor_generate_ir {*decoder_config}; + ctf_visitor_generate_ir::UP ctx {new ctf_visitor_generate_ir {*decoder_config}}; if (decoder_config->self_comp) { ctx->trace_class = bt_trace_class_create(decoder_config->self_comp); @@ -541,7 +541,7 @@ ctx_create(const struct ctf_metadata_decoder_config *decoder_config) } /* Root declaration scope */ - ctx->current_scope = ctx_decl_scope_create(ctx, NULL); + ctx->current_scope = ctx_decl_scope_create(ctx.get(), NULL); if (!ctx->current_scope) { BT_CLOGE_APPEND_CAUSE("Cannot create declaration scope."); goto error; @@ -551,8 +551,7 @@ ctx_create(const struct ctf_metadata_decoder_config *decoder_config) goto end; error: - ctx_destroy(ctx); - ctx = NULL; + ctx.reset(); end: return ctx; @@ -4423,13 +4422,11 @@ end: } BT_HIDDEN -struct ctf_visitor_generate_ir * +ctf_visitor_generate_ir::UP ctf_visitor_generate_ir_create(const struct ctf_metadata_decoder_config *decoder_config) { - struct ctf_visitor_generate_ir *ctx = NULL; - /* Create visitor's context */ - ctx = ctx_create(decoder_config); + ctf_visitor_generate_ir::UP ctx = ctx_create(decoder_config); if (!ctx) { BT_CLOGE_APPEND_CAUSE_EX(decoder_config->logCfg, "Cannot create visitor's context."); goto error; @@ -4438,19 +4435,22 @@ ctf_visitor_generate_ir_create(const struct ctf_metadata_decoder_config *decoder goto end; error: - ctx_destroy(ctx); - ctx = NULL; + ctx.reset(); end: return ctx; } -BT_HIDDEN -void ctf_visitor_generate_ir_destroy(struct ctf_visitor_generate_ir *visitor) +static void ctf_visitor_generate_ir_destroy(struct ctf_visitor_generate_ir *visitor) { ctx_destroy(visitor); } +void ctf_visitor_generate_ir_deleter::operator()(ctf_visitor_generate_ir *visitor) +{ + ctf_visitor_generate_ir_destroy(visitor); +} + BT_HIDDEN bt_trace_class *ctf_visitor_generate_ir_get_ir_trace_class(struct ctf_visitor_generate_ir *ctx) {