X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=blobdiff_plain;f=formats%2Fctf%2Fmetadata%2Fctf-visitor-generate-io-struct.c;h=2d3361cbdc5d3d889cbeed4ff7b281e0c8b2473c;hp=2db25794aed6741cea5e8ef1b5dc4afd5740d5f0;hb=bf94ab2bcad1aa584a1ecc763ce390d583b62f0c;hpb=209209be7f87974d7b4acee9af37a51aced870f3 diff --git a/formats/ctf/metadata/ctf-visitor-generate-io-struct.c b/formats/ctf/metadata/ctf-visitor-generate-io-struct.c index 2db25794..2d3361cb 100644 --- a/formats/ctf/metadata/ctf-visitor-generate-io-struct.c +++ b/formats/ctf/metadata/ctf-visitor-generate-io-struct.c @@ -2160,7 +2160,7 @@ int ctf_clock_declaration_visit(FILE *fd, int depth, struct ctf_node *node, } clock->name = g_quark_from_string(right); g_free(right); - CTF_EVENT_SET_FIELD(clock, name); + CTF_CLOCK_SET_FIELD(clock, name); } else if (!strcmp(left, "uuid")) { char *right; @@ -2191,7 +2191,7 @@ int ctf_clock_declaration_visit(FILE *fd, int depth, struct ctf_node *node, } clock->description = right; } else if (!strcmp(left, "freq")) { - if (clock->freq) { + if (CTF_CLOCK_FIELD_IS_SET(clock, freq)) { fprintf(fd, "[error] %s: freq already declared in clock declaration\n", __func__); ret = -EPERM; goto error; @@ -2202,6 +2202,7 @@ int ctf_clock_declaration_visit(FILE *fd, int depth, struct ctf_node *node, ret = -EINVAL; goto error; } + CTF_CLOCK_SET_FIELD(clock, freq); } else if (!strcmp(left, "precision")) { if (clock->precision) { fprintf(fd, "[error] %s: precision already declared in clock declaration\n", __func__); @@ -2273,6 +2274,8 @@ int ctf_clock_visit(FILE *fd, int depth, struct ctf_node *node, struct ctf_trace struct ctf_clock *clock; clock = g_new0(struct ctf_clock, 1); + /* Default clock frequency is set to 1000000000 */ + clock->freq = 1000000000ULL; cds_list_for_each_entry(iter, &node->u.clock.declaration_list, siblings) { ret = ctf_clock_declaration_visit(fd, depth + 1, iter, clock, trace); if (ret) @@ -2283,6 +2286,12 @@ int ctf_clock_visit(FILE *fd, int depth, struct ctf_node *node, struct ctf_trace fprintf(fd, "[error] %s: missing namefield in clock declaration\n", __func__); goto error; } + if (g_hash_table_size(trace->clocks) > 0) { + fprintf(stderr, "[error] Only CTF traces with a single clock description are supported by this babeltrace version.\n"); + ret = -EINVAL; + goto error; + } + trace->single_clock = clock; g_hash_table_insert(trace->clocks, (gpointer) (unsigned long) clock->name, clock); return 0; @@ -2301,11 +2310,142 @@ void clock_free(gpointer data) g_free(clock); } +static +int ctf_env_declaration_visit(FILE *fd, int depth, struct ctf_node *node, + struct ctf_trace *trace) +{ + int ret = 0; + struct ctf_tracer_env *env = &trace->env; + + switch (node->type) { + case NODE_CTF_EXPRESSION: + { + char *left; + + left = concatenate_unary_strings(&node->u.ctf_expression.left); + if (!strcmp(left, "vpid")) { + uint64_t v; + + if (env->vpid != -1) { + fprintf(fd, "[error] %s: vpid already declared in env declaration\n", __func__); + goto error; /* ret is 0, so not an actual error, just warn. */ + } + ret = get_unary_unsigned(&node->u.ctf_expression.right, &v); + if (ret) { + fprintf(fd, "[error] %s: unexpected unary expression for env vpid\n", __func__); + goto error; /* ret is 0, so not an actual error, just warn. */ + } + env->vpid = (int) v; + printf_verbose("env.vpid = %d\n", env->vpid); + } else if (!strcmp(left, "procname")) { + char *right; + + if (env->procname[0]) { + fprintf(fd, "[warning] %s: duplicated env procname\n", __func__); + goto error; /* ret is 0, so not an actual error, just warn. */ + } + right = concatenate_unary_strings(&node->u.ctf_expression.right); + if (!right) { + fprintf(fd, "[warning] %s: unexpected unary expression for env procname\n", __func__); + goto error; /* ret is 0, so not an actual error, just warn. */ + } + strncpy(env->procname, right, TRACER_ENV_LEN); + env->procname[TRACER_ENV_LEN - 1] = '\0'; + printf_verbose("env.procname = %s\n", env->procname); + } else if (!strcmp(left, "domain")) { + char *right; + + if (env->domain[0]) { + fprintf(fd, "[warning] %s: duplicated env domain\n", __func__); + goto error; /* ret is 0, so not an actual error, just warn. */ + } + right = concatenate_unary_strings(&node->u.ctf_expression.right); + if (!right) { + fprintf(fd, "[warning] %s: unexpected unary expression for env domain\n", __func__); + goto error; /* ret is 0, so not an actual error, just warn. */ + } + strncpy(env->domain, right, TRACER_ENV_LEN); + env->domain[TRACER_ENV_LEN - 1] = '\0'; + printf_verbose("env.domain = %s\n", env->domain); + } else if (!strcmp(left, "sysname")) { + char *right; + + if (env->sysname[0]) { + fprintf(fd, "[warning] %s: duplicated env sysname\n", __func__); + goto error; /* ret is 0, so not an actual error, just warn. */ + } + right = concatenate_unary_strings(&node->u.ctf_expression.right); + if (!right) { + fprintf(fd, "[warning] %s: unexpected unary expression for env sysname\n", __func__); + goto error; /* ret is 0, so not an actual error, just warn. */ + } + strncpy(env->sysname, right, TRACER_ENV_LEN); + env->sysname[TRACER_ENV_LEN - 1] = '\0'; + printf_verbose("env.sysname = %s\n", env->sysname); + } else if (!strcmp(left, "release")) { + char *right; + + if (env->release[0]) { + fprintf(fd, "[warning] %s: duplicated env release\n", __func__); + goto error; /* ret is 0, so not an actual error, just warn. */ + } + right = concatenate_unary_strings(&node->u.ctf_expression.right); + if (!right) { + fprintf(fd, "[warning] %s: unexpected unary expression for env release\n", __func__); + goto error; /* ret is 0, so not an actual error, just warn. */ + } + strncpy(env->release, right, TRACER_ENV_LEN); + env->release[TRACER_ENV_LEN - 1] = '\0'; + printf_verbose("env.release = %s\n", env->release); + } else if (!strcmp(left, "version")) { + char *right; + + if (env->version[0]) { + fprintf(fd, "[warning] %s: duplicated env version\n", __func__); + goto error; /* ret is 0, so not an actual error, just warn. */ + } + right = concatenate_unary_strings(&node->u.ctf_expression.right); + if (!right) { + fprintf(fd, "[warning] %s: unexpected unary expression for env version\n", __func__); + goto error; /* ret is 0, so not an actual error, just warn. */ + } + strncpy(env->version, right, TRACER_ENV_LEN); + env->version[TRACER_ENV_LEN - 1] = '\0'; + printf_verbose("env.version = %s\n", env->version); + } else { + printf_verbose("%s: attribute \"%s\" is unknown in environment declaration.\n", __func__, left); + } + +error: + g_free(left); + break; + } + default: + return -EPERM; + } + + return ret; +} + static int ctf_env_visit(FILE *fd, int depth, struct ctf_node *node, struct ctf_trace *trace) { - fprintf(fd, "[warning] %s: environment declaration support not implement yet.\n", __func__); - return 0; /* continue */ + int ret = 0; + struct ctf_node *iter; + + trace->env.vpid = -1; + trace->env.procname[0] = '\0'; + trace->env.domain[0] = '\0'; + trace->env.sysname[0] = '\0'; + trace->env.release[0] = '\0'; + trace->env.version[0] = '\0'; + cds_list_for_each_entry(iter, &node->u.env.declaration_list, siblings) { + ret = ctf_env_declaration_visit(fd, depth + 1, iter, trace); + if (ret) + goto error; + } +error: + return 0; } static @@ -2372,15 +2512,6 @@ retry: switch (node->type) { case NODE_ROOT: if (!env_clock_done) { - cds_list_for_each_entry(iter, &node->u.root.env, siblings) { - ret = ctf_env_visit(fd, depth + 1, iter, - trace); - if (ret) { - fprintf(fd, "[error] %s: env declaration error\n", __func__); - goto error; - } - } - /* * declarations need to query clock hash table, * so clock need to be treated first. @@ -2424,6 +2555,13 @@ retry: ret = -EINVAL; goto error; } + cds_list_for_each_entry(iter, &node->u.root.env, siblings) { + ret = ctf_env_visit(fd, depth + 1, iter, trace); + if (ret) { + fprintf(fd, "[error] %s: env declaration error\n", __func__); + goto error; + } + } cds_list_for_each_entry(iter, &node->u.root.stream, siblings) { ret = ctf_stream_visit(fd, depth + 1, iter, trace->root_declaration_scope, trace);