X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=formats%2Fctf%2Fmetadata%2Fctf-visitor-generate-io-struct.c;h=1fc69125ce8ef180c70fc0f95b48042c7959ea2c;hb=f57447bdfc29e7390c32661341ef50ae1d9ab208;hp=4a71a27e04024dae8ecfab95d69cd5854391bc13;hpb=6070d2f1612a27050f14362a910b565b8e70662c;p=babeltrace.git diff --git a/formats/ctf/metadata/ctf-visitor-generate-io-struct.c b/formats/ctf/metadata/ctf-visitor-generate-io-struct.c index 4a71a27e..1fc69125 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; @@ -2292,6 +2301,23 @@ error: return ret; } +static +void ctf_clock_default(FILE *fd, int depth, struct ctf_trace *trace) +{ + struct ctf_clock *clock; + + clock = g_new0(struct ctf_clock, 1); + clock->name = g_quark_from_string("monotonic"); + clock->uuid = 0; + clock->description = g_strdup("Default clock"); + /* Default clock frequency is set to 1000000000 */ + clock->freq = 1000000000ULL; + clock->absolute = 0; /* Not an absolute reference across traces */ + + trace->single_clock = clock; + g_hash_table_insert(trace->clocks, (gpointer) (unsigned long) clock->name, clock); +} + static void clock_free(gpointer data) { @@ -2507,12 +2533,16 @@ retry: * declarations need to query clock hash table, * so clock need to be treated first. */ - cds_list_for_each_entry(iter, &node->u.root.clock, siblings) { - ret = ctf_clock_visit(fd, depth + 1, iter, - trace); - if (ret) { - fprintf(fd, "[error] %s: clock declaration error\n", __func__); - goto error; + if (cds_list_empty(&node->u.root.clock)) { + ctf_clock_default(fd, depth + 1, trace); + } else { + cds_list_for_each_entry(iter, &node->u.root.clock, siblings) { + ret = ctf_clock_visit(fd, depth + 1, iter, + trace); + if (ret) { + fprintf(fd, "[error] %s: clock declaration error\n", __func__); + goto error; + } } } env_clock_done = 1;