ctf: use unique_ptr to manage ctf_visitor_generate_ir lifetime
authorSimon Marchi <simon.marchi@efficios.com>
Tue, 26 Jul 2022 20:58:53 +0000 (16:58 -0400)
committerSimon Marchi <simon.marchi@efficios.com>
Tue, 23 Aug 2022 16:06:15 +0000 (12:06 -0400)
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 <simon.marchi@efficios.com>
Reviewed-on: https://review.lttng.org/c/babeltrace/+/8163
Reviewed-by: Philippe Proulx <eeppeliteloop@gmail.com>
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 5d80c6eb0d530ff5ac3215300d6e1047acd4de47..bb9cb5fb98f7f64d725ea6bcdce1452a99384caf 100644 (file)
@@ -7,6 +7,7 @@
 #ifndef _CTF_AST_H
 #define _CTF_AST_H
 
+#include <memory>
 #include <stdint.h>
 #include <stdio.h>
 #include <glib.h>
@@ -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<ctf_visitor_generate_ir, ctf_visitor_generate_ir_deleter>;
+
     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);
 
index f6849dd52027c48e9e07dd8e53676dd6e7ac92fd..769adabd2ca2b7ac441db9de9340013d74fed5e0 100644 (file)
@@ -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
index 85925253724b0f5fe627ca8cc409f5abe57c8b31..8f48b9b24d02f0f68c1d52b19d6a217e7f648d63 100644 (file)
@@ -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)
 {
This page took 0.052272 seconds and 5 git commands to generate.