From: Simon Marchi Date: Tue, 9 Apr 2024 20:29:35 +0000 (-0400) Subject: ctf: use unique_ptr to manage ctf_visitor_generate_ir lifetime X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=commitdiff_plain;h=708dab6b1c5897b844ae6f7bf2be7da03183cf84 ctf: use unique_ptr to manage ctf_visitor_generate_ir lifetime Define ctf_visitor_generate_ir::UP as a unique_ptr type with a custom 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 Reviewed-on: https://review.lttng.org/c/babeltrace/+/12265 Tested-by: jenkins --- diff --git a/src/plugins/ctf/common/src/metadata/tsdl/ast.hpp b/src/plugins/ctf/common/src/metadata/tsdl/ast.hpp index 962dad55..5c1b71c2 100644 --- a/src/plugins/ctf/common/src/metadata/tsdl/ast.hpp +++ b/src/plugins/ctf/common/src/metadata/tsdl/ast.hpp @@ -7,6 +7,8 @@ #ifndef _CTF_AST_H #define _CTF_AST_H +#include + #include #include #include @@ -475,8 +477,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(ctf_metadata_decoder_config decoderConfig, bt2c::Logger loggerParam) : decoder_config {std::move(decoderConfig)}, @@ -505,11 +514,9 @@ struct ctf_visitor_generate_ir bt2c::Logger logger; }; -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_trace_class *ctf_visitor_generate_ir_get_ir_trace_class(struct ctf_visitor_generate_ir *visitor); struct ctf_trace_class * diff --git a/src/plugins/ctf/common/src/metadata/tsdl/decoder.cpp b/src/plugins/ctf/common/src/metadata/tsdl/decoder.cpp index 71fdcadf..739c648b 100644 --- a/src/plugins/ctf/common/src/metadata/tsdl/decoder.cpp +++ b/src/plugins/ctf/common/src/metadata/tsdl/decoder.cpp @@ -31,7 +31,7 @@ struct ctf_metadata_decoder bt2c::Logger logger; 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; @@ -157,7 +157,7 @@ void ctf_metadata_decoder_destroy(struct ctf_metadata_decoder *mdec) } BT_CPPLOGD_SPEC(mdec->logger, "Destroying CTF metadata decoder: addr={}", fmt::ptr(mdec)); - ctf_visitor_generate_ir_destroy(mdec->visitor); + delete mdec; } @@ -316,7 +316,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 */ @@ -361,7 +361,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()); } struct ctf_trace_class * @@ -369,7 +369,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()); } const char *ctf_metadata_decoder_get_text(struct ctf_metadata_decoder *mdec) 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 41d7410c..6416b337 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 @@ -483,12 +483,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, const bt2c::Logger& logger) { BT_ASSERT(decoder_config); - ctf_visitor_generate_ir *ctx = new ctf_visitor_generate_ir {*decoder_config, logger}; + ctf_visitor_generate_ir::UP ctx {new ctf_visitor_generate_ir {*decoder_config, logger}}; if (decoder_config->self_comp) { ctx->trace_class = bt_trace_class_create(decoder_config->self_comp); @@ -505,7 +505,7 @@ ctx_create(const struct ctf_metadata_decoder_config *decoder_config, const bt2c: } /* 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_CPPLOGE_APPEND_CAUSE_SPEC(ctx->logger, "Cannot create declaration scope."); goto error; @@ -514,8 +514,7 @@ ctx_create(const struct ctf_metadata_decoder_config *decoder_config, const bt2c: goto end; error: - ctx_destroy(ctx); - ctx = NULL; + ctx.reset(); end: return ctx; @@ -4411,15 +4410,14 @@ end: return ret; } -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; - bt2c::Logger logger {decoder_config->logger, "PLUGIN/CTF/META/IR-VISITOR"}; /* Create visitor's context */ - ctx = ctx_create(decoder_config, logger); + ctf_visitor_generate_ir::UP ctx = ctx_create(decoder_config, logger); + if (!ctx) { BT_CPPLOGE_APPEND_CAUSE_SPEC(logger, "Cannot create visitor's context."); goto error; @@ -4428,18 +4426,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; } -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_trace_class *ctf_visitor_generate_ir_get_ir_trace_class(struct ctf_visitor_generate_ir *ctx) { BT_ASSERT_DBG(ctx);