`ctf` plugin: metadata: use local log level
[babeltrace.git] / src / plugins / ctf / common / metadata / ctf-meta-resolve.c
index 130ae61b86a86f75877e253ece23e7be02385fab..4b6590f0fdb5ee21f376e24088c4783f90371be4 100644 (file)
  * all copies or substantial portions of the Software.
  */
 
-#define BT_LOG_TAG "PLUGIN-CTF-METADATA-META-RESOLVE"
-#include "logging.h"
+#define BT_LOG_OUTPUT_LEVEL (ctx->log_level)
+#define BT_LOG_TAG "PLUGIN/CTF/META/RESOLVE"
+#include "logging/log.h"
 
 #include <babeltrace2/babeltrace.h>
-#include "common/babeltrace.h"
+#include "common/macros.h"
 #include "common/assert.h"
 #include "common/common.h"
 #include <glib.h>
@@ -50,6 +51,7 @@ struct field_class_stack_frame {
  * The current context of the resolving engine.
  */
 struct resolve_context {
+       bt_logging_level log_level;
        struct ctf_trace_class *tc;
        struct ctf_stream_class *sc;
        struct ctf_event_class *ec;
@@ -124,7 +126,8 @@ void field_class_stack_destroy(field_class_stack *stack)
  * Pushes a field class onto a class stack.
  */
 static
-int field_class_stack_push(field_class_stack *stack, struct ctf_field_class *fc)
+int field_class_stack_push(field_class_stack *stack, struct ctf_field_class *fc,
+               struct resolve_context *ctx)
 {
        int ret = 0;
        struct field_class_stack_frame *frame = NULL;
@@ -142,7 +145,7 @@ int field_class_stack_push(field_class_stack *stack, struct ctf_field_class *fc)
                goto end;
        }
 
-       BT_LOGV("Pushing field class on context's stack: "
+       BT_LOGD("Pushing field class on context's stack: "
                "fc-addr=%p, stack-size-before=%u", fc, stack->len);
        frame->fc = fc;
        g_ptr_array_add(stack, frame);
@@ -209,14 +212,15 @@ end:
  * Removes the top frame of `stack`.
  */
 static
-void field_class_stack_pop(field_class_stack *stack)
+void field_class_stack_pop(field_class_stack *stack,
+               struct resolve_context *ctx)
 {
        if (!field_class_stack_empty(stack)) {
                /*
                 * This will call the frame's destructor and free it, as
                 * well as put its contained field class.
                 */
-               BT_LOGV("Popping context's stack: stack-size-before=%u",
+               BT_LOGD("Popping context's stack: stack-size-before=%u",
                        stack->len);
                g_ptr_array_set_size(stack, stack->len - 1);
        }
@@ -254,7 +258,8 @@ struct ctf_field_class *borrow_class_from_ctx(struct resolve_context *ctx,
  * is found to be relative.
  */
 static
-enum ctf_scope get_root_scope_from_absolute_pathstr(const char *pathstr)
+enum ctf_scope get_root_scope_from_absolute_pathstr(const char *pathstr,
+               struct resolve_context *ctx)
 {
        enum ctf_scope scope;
        enum ctf_scope ret = -1;
@@ -272,7 +277,7 @@ enum ctf_scope get_root_scope_from_absolute_pathstr(const char *pathstr)
                if (strncmp(pathstr, absolute_path_prefixes[scope],
                                strlen(absolute_path_prefixes[scope]))) {
                        /* Prefix does not match: try the next one */
-                       BT_LOGV("Prefix does not match: trying the next one: "
+                       BT_LOGD("Prefix does not match: trying the next one: "
                                "path=\"%s\", path-prefix=\"%s\", scope=%s",
                                pathstr, absolute_path_prefixes[scope],
                                ctf_scope_string(scope));
@@ -281,7 +286,7 @@ enum ctf_scope get_root_scope_from_absolute_pathstr(const char *pathstr)
 
                /* Found it! */
                ret = scope;
-               BT_LOGV("Found root scope from absolute path: "
+               BT_LOGD("Found root scope from absolute path: "
                        "path=\"%s\", scope=%s", pathstr,
                        ctf_scope_string(scope));
                goto end;
@@ -331,7 +336,7 @@ const char *ptoken_get_string(GList *ptoken)
  * strings.
  */
 static
-GList *pathstr_to_ptokens(const char *pathstr)
+GList *pathstr_to_ptokens(const char *pathstr, struct resolve_context *ctx)
 {
        const char *at = pathstr;
        const char *last = at;
@@ -379,7 +384,8 @@ error:
  */
 static
 int ptokens_to_field_path(GList *ptokens, struct ctf_field_path *field_path,
-               struct ctf_field_class *fc, int64_t src_index)
+               struct ctf_field_class *fc, int64_t src_index,
+               struct resolve_context *ctx)
 {
        int ret = 0;
        GList *cur_ptoken = ptokens;
@@ -391,7 +397,7 @@ int ptokens_to_field_path(GList *ptokens, struct ctf_field_path *field_path,
                struct ctf_field_class *child_fc;
                const char *ft_name = ptoken_get_string(cur_ptoken);
 
-               BT_LOGV("Current path token: token=\"%s\"", ft_name);
+               BT_LOGD("Current path token: token=\"%s\"", ft_name);
 
                /* Find to which index corresponds the current path token */
                if (fc->type == CTF_FIELD_CLASS_TYPE_ARRAY ||
@@ -406,7 +412,7 @@ int ptokens_to_field_path(GList *ptokens, struct ctf_field_path *field_path,
                                 * Error: field name does not exist or
                                 * wrong current class.
                                 */
-                               BT_LOGV("Cannot get index of field class: "
+                               BT_LOGD("Cannot get index of field class: "
                                        "field-name=\"%s\", "
                                        "src-index=%" PRId64 ", "
                                        "child-index=%" PRId64 ", "
@@ -417,7 +423,7 @@ int ptokens_to_field_path(GList *ptokens, struct ctf_field_path *field_path,
                                goto end;
                        } else if (child_index > src_index &&
                                        !first_level_done) {
-                               BT_LOGV("Child field class is located after source field class: "
+                               BT_LOGD("Child field class is located after source field class: "
                                        "field-name=\"%s\", "
                                        "src-index=%" PRId64 ", "
                                        "child-index=%" PRId64 ", "
@@ -540,7 +546,7 @@ int absolute_ptokens_to_field_path(GList *ptokens,
        }
 
        /* Locate target */
-       ret = ptokens_to_field_path(cur_ptoken, field_path, fc, INT64_MAX);
+       ret = ptokens_to_field_path(cur_ptoken, field_path, fc, INT64_MAX, ctx);
 
 end:
        return ret;
@@ -571,17 +577,17 @@ int relative_ptokens_to_field_path(GList *ptokens,
                int64_t cur_index = field_class_stack_at(ctx->field_class_stack,
                        parent_pos_in_stack)->index;
 
-               BT_LOGV("Locating target field class from current parent field class: "
+               BT_LOGD("Locating target field class from current parent field class: "
                        "parent-pos=%" PRId64 ", parent-fc-addr=%p, "
                        "cur-index=%" PRId64,
                        parent_pos_in_stack, parent_class, cur_index);
 
                /* Locate target from current parent class */
                ret = ptokens_to_field_path(ptokens, &tail_field_path,
-                       parent_class, cur_index);
+                       parent_class, cur_index, ctx);
                if (ret) {
                        /* Not found... yet */
-                       BT_LOGV_STR("Not found at this point.");
+                       BT_LOGD_STR("Not found at this point.");
                        ctf_field_path_clear(&tail_field_path);
                } else {
                        /* Found: stitch tail field path to head field path */
@@ -641,7 +647,7 @@ int pathstr_to_field_path(const char *pathstr,
        GList *ptokens = NULL;
 
        /* Convert path string to path tokens */
-       ptokens = pathstr_to_ptokens(pathstr);
+       ptokens = pathstr_to_ptokens(pathstr, ctx);
        if (!ptokens) {
                BT_LOGE("Cannot convert path string to path tokens: "
                        "path=\"%s\"", pathstr);
@@ -650,12 +656,12 @@ int pathstr_to_field_path(const char *pathstr,
        }
 
        /* Absolute or relative path? */
-       root_scope = get_root_scope_from_absolute_pathstr(pathstr);
+       root_scope = get_root_scope_from_absolute_pathstr(pathstr, ctx);
 
        if (root_scope == -1) {
                /* Relative path: start with current root scope */
                field_path->root = ctx->root_scope;
-               BT_LOGV("Detected relative path: starting with current root scope: "
+               BT_LOGD("Detected relative path: starting with current root scope: "
                        "scope=%s", ctf_scope_string(field_path->root));
                ret = relative_ptokens_to_field_path(ptokens, field_path, ctx);
                if (ret) {
@@ -668,7 +674,7 @@ int pathstr_to_field_path(const char *pathstr,
        } else {
                /* Absolute path: use found root scope */
                field_path->root = root_scope;
-               BT_LOGV("Detected absolute path: using root scope: "
+               BT_LOGD("Detected absolute path: using root scope: "
                        "scope=%s", ctf_scope_string(field_path->root));
                ret = absolute_ptokens_to_field_path(ptokens, field_path, ctx);
                if (ret) {
@@ -684,7 +690,7 @@ int pathstr_to_field_path(const char *pathstr,
                const char *field_path_pretty_str =
                        field_path_pretty ? field_path_pretty->str : NULL;
 
-               BT_LOGV("Found field path: path=\"%s\", field-path=\"%s\"",
+               BT_LOGD("Found field path: path=\"%s\", field-path=\"%s\"",
                        pathstr, field_path_pretty_str);
 
                if (field_path_pretty) {
@@ -762,7 +768,8 @@ void get_ctx_stack_field_path(struct resolve_context *ctx,
  * objects having the same root scope.
  */
 int64_t get_field_paths_lca_index(struct ctf_field_path *field_path1,
-               struct ctf_field_path *field_path2)
+               struct ctf_field_path *field_path2,
+               struct resolve_context *ctx)
 {
        int64_t lca_index = 0;
        uint64_t field_path1_len, field_path2_len;
@@ -777,7 +784,7 @@ int64_t get_field_paths_lca_index(struct ctf_field_path *field_path1,
                const char *field_path2_pretty_str =
                        field_path2_pretty ? field_path2_pretty->str : NULL;
 
-               BT_LOGV("Finding lowest common ancestor (LCA) between two field paths: "
+               BT_LOGD("Finding lowest common ancestor (LCA) between two field paths: "
                        "field-path-1=\"%s\", field-path-2=\"%s\"",
                        field_path1_pretty_str, field_path2_pretty_str);
 
@@ -829,7 +836,7 @@ int64_t get_field_paths_lca_index(struct ctf_field_path *field_path1,
                lca_index++;
        }
 
-       BT_LOGV("Found LCA: lca-index=%" PRId64, lca_index);
+       BT_LOGD("Found LCA: lca-index=%" PRId64, lca_index);
        return lca_index;
 }
 
@@ -880,7 +887,7 @@ int validate_target_field_path(struct ctf_field_path *target_field_path,
                 * paths.
                 */
                lca_index = get_field_paths_lca_index(target_field_path,
-                       &ctx_field_path);
+                       &ctx_field_path, ctx);
                if (lca_index < 0) {
                        BT_LOGE_STR("Cannot get least common ancestor.");
                        ret = -1;
@@ -1099,7 +1106,7 @@ int resolve_field_class(struct ctf_field_class *fc, struct resolve_context *ctx)
                uint64_t field_count =
                        ctf_field_class_compound_get_field_class_count(fc);
 
-               ret = field_class_stack_push(ctx->field_class_stack, fc);
+               ret = field_class_stack_push(ctx->field_class_stack, fc, ctx);
                if (ret) {
                        BT_LOGE("Cannot push field class on context's stack: "
                                "fc-addr=%p", fc);
@@ -1123,7 +1130,7 @@ int resolve_field_class(struct ctf_field_class *fc, struct resolve_context *ctx)
                                                (int64_t) i;
                        }
 
-                       BT_LOGV("Resolving field class's child field class: "
+                       BT_LOGD("Resolving field class's child field class: "
                                "parent-fc-addr=%p, child-fc-addr=%p, "
                                "index=%" PRIu64 ", count=%" PRIu64,
                                fc, child_fc, i, field_count);
@@ -1133,7 +1140,7 @@ int resolve_field_class(struct ctf_field_class *fc, struct resolve_context *ctx)
                        }
                }
 
-               field_class_stack_pop(ctx->field_class_stack);
+               field_class_stack_pop(ctx->field_class_stack, ctx);
                break;
        }
        default:
@@ -1259,11 +1266,13 @@ end:
 }
 
 BT_HIDDEN
-int ctf_trace_class_resolve_field_classes(struct ctf_trace_class *tc)
+int ctf_trace_class_resolve_field_classes(struct ctf_trace_class *tc,
+               bt_logging_level log_level)
 {
        int ret = 0;
        uint64_t i;
-       struct resolve_context ctx = {
+       struct resolve_context local_ctx = {
+               .log_level = log_level,
                .tc = tc,
                .sc = NULL,
                .ec = NULL,
@@ -1278,18 +1287,19 @@ int ctf_trace_class_resolve_field_classes(struct ctf_trace_class *tc)
                .root_scope = CTF_SCOPE_PACKET_HEADER,
                .cur_fc = NULL,
        };
+       struct resolve_context *ctx = &local_ctx;
 
        /* Initialize class stack */
-       ctx.field_class_stack = field_class_stack_create();
-       if (!ctx.field_class_stack) {
+       ctx->field_class_stack = field_class_stack_create();
+       if (!ctx->field_class_stack) {
                BT_LOGE_STR("Cannot create field class stack.");
                ret = -1;
                goto end;
        }
 
        if (!tc->is_translated) {
-               ctx.scopes.packet_header = tc->packet_header_fc;
-               ret = resolve_root_class(CTF_SCOPE_PACKET_HEADER, &ctx);
+               ctx->scopes.packet_header = tc->packet_header_fc;
+               ret = resolve_root_class(CTF_SCOPE_PACKET_HEADER, ctx);
                if (ret) {
                        BT_LOGE("Cannot resolve packet header field class: "
                                "ret=%d", ret);
@@ -1297,12 +1307,12 @@ int ctf_trace_class_resolve_field_classes(struct ctf_trace_class *tc)
                }
        }
 
-       ctx.scopes.packet_header = tc->packet_header_fc;
+       ctx->scopes.packet_header = tc->packet_header_fc;
 
        for (i = 0; i < tc->stream_classes->len; i++) {
                struct ctf_stream_class *sc = tc->stream_classes->pdata[i];
 
-               ret = resolve_stream_class_field_classes(&ctx, sc);
+               ret = resolve_stream_class_field_classes(ctx, sc);
                if (ret) {
                        BT_LOGE("Cannot resolve stream class's field classes: "
                                "sc-id=%" PRIu64, sc->id);
@@ -1311,6 +1321,6 @@ int ctf_trace_class_resolve_field_classes(struct ctf_trace_class *tc)
        }
 
 end:
-       field_class_stack_destroy(ctx.field_class_stack);
+       field_class_stack_destroy(ctx->field_class_stack);
        return ret;
 }
This page took 0.028776 seconds and 4 git commands to generate.