Use default if there is no clock declaration
authorJuha Niskanen <juniskane@gmail.com>
Mon, 13 Feb 2012 13:55:20 +0000 (08:55 -0500)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Mon, 13 Feb 2012 13:55:20 +0000 (08:55 -0500)
In absence of clock description in metadata, use a default clock
source which increments once per nanosecond.

Without this patch, the converter crashes when given old traces
that are lacking clock description block.

[ Edit by Mathieu Desnoyers: style cleanup, added clock description,
  added comments. ]

Signed-off-by: Juha Niskanen <juniskane@gmail.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
formats/ctf/metadata/ctf-visitor-generate-io-struct.c

index 2d3361cbdc5d3d889cbeed4ff7b281e0c8b2473c..1fc69125ce8ef180c70fc0f95b48042c7959ea2c 100644 (file)
@@ -2301,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)
 {
@@ -2516,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;
This page took 0.03702 seconds and 4 git commands to generate.