ctf: use unique_ptr to manage ctf_visitor_generate_ir lifetime
authorSimon Marchi <simon.marchi@efficios.com>
Tue, 9 Apr 2024 20:29:35 +0000 (16:29 -0400)
committerSimon Marchi <simon.marchi@efficios.com>
Wed, 17 Apr 2024 17:57:53 +0000 (13:57 -0400)
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 <simon.marchi@efficios.com>
Reviewed-on: https://review.lttng.org/c/babeltrace/+/8163
Reviewed-by: Philippe Proulx <eeppeliteloop@gmail.com>
Reviewed-on: https://review.lttng.org/c/babeltrace/+/12265
Tested-by: jenkins <jenkins@lttng.org>
src/plugins/ctf/common/src/metadata/tsdl/ast.hpp
src/plugins/ctf/common/src/metadata/tsdl/decoder.cpp
src/plugins/ctf/common/src/metadata/tsdl/visitor-generate-ir.cpp

index 962dad553b4f67c1a0ef0bc08ca4e3bb0ceb8ccb..5c1b71c2c7b868fe9ec21947e79e3081d8456c84 100644 (file)
@@ -7,6 +7,8 @@
 #ifndef _CTF_AST_H
 #define _CTF_AST_H
 
+#include <memory>
+
 #include <glib.h>
 #include <stdint.h>
 #include <stdio.h>
@@ -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<ctf_visitor_generate_ir, ctf_visitor_generate_ir_deleter>;
+
     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 *
index 71fdcadf31c08eea8824fdb7f0a24833984a5101..739c648b278a10937f65c26741c2caebc6adf11a 100644 (file)
@@ -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)
index 41d7410cb97eca8f17b595aae42f03407ad32803..6416b3378af71711cc1395add05d8735c7cd191f 100644 (file)
@@ -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);
This page took 0.027474 seconds and 4 git commands to generate.