Add clock offset support
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Mon, 30 Jan 2012 17:53:50 +0000 (12:53 -0500)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Mon, 30 Jan 2012 17:53:50 +0000 (12:53 -0500)
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
converter/babeltrace.c
formats/ctf-text/ctf-text.c
include/babeltrace/babeltrace-internal.h
include/babeltrace/ctf-ir/metadata.h

index 0cdd42e3611442734efcbe13d33408c260e42ec7..22ec92446c5c32ea337706e1355496a5b1be93c7 100644 (file)
@@ -323,6 +323,7 @@ static void finalize_trace_collection(struct trace_collection *tc)
 struct clock_match {
        GHashTable *clocks;
        struct ctf_clock *clock_match;
 struct clock_match {
        GHashTable *clocks;
        struct ctf_clock *clock_match;
+       struct trace_collection *tc;
 };
 
 static void check_clock_match(gpointer key, gpointer value, gpointer user_data)
 };
 
 static void check_clock_match(gpointer key, gpointer value, gpointer user_data)
@@ -357,7 +358,8 @@ static void check_clock_match(gpointer key, gpointer value, gpointer user_data)
 
 static void clock_add(gpointer key, gpointer value, gpointer user_data)
 {
 
 static void clock_add(gpointer key, gpointer value, gpointer user_data)
 {
-       GHashTable *tc_clocks = user_data;
+       struct clock_match *clock_match = user_data;
+       GHashTable *tc_clocks = clock_match->clocks;
        struct ctf_clock *t_clock = value;
        GQuark v;
 
        struct ctf_clock *t_clock = value;
        GQuark v;
 
@@ -371,6 +373,16 @@ static void clock_add(gpointer key, gpointer value, gpointer user_data)
                tc_clock = g_hash_table_lookup(tc_clocks,
                                (gpointer) (unsigned long) v);
                if (!tc_clock) {
                tc_clock = g_hash_table_lookup(tc_clocks,
                                (gpointer) (unsigned long) v);
                if (!tc_clock) {
+                       /*
+                        * For now, we only support CTF that has one
+                        * single clock.
+                        */
+                       if (g_hash_table_size(tc_clocks) > 0) {
+                               fprintf(stderr, "[error] Only CTF traces with a single clock description are supported by this babeltrace version.\n");
+                       }
+                       if (!clock_match->tc->single_clock) {
+                               clock_match->tc->single_clock = value;
+                       }
                        g_hash_table_insert(tc_clocks,
                                (gpointer) (unsigned long) v,
                                value);
                        g_hash_table_insert(tc_clocks,
                                (gpointer) (unsigned long) v,
                                value);
@@ -391,8 +403,8 @@ static void clock_add(gpointer key, gpointer value, gpointer user_data)
                                diff_ns < 0 ? -diff_ns : diff_ns);
                        if (diff_ns > 10000) {
                                fprintf(stderr, "[warning] Clock \"%s\" offset differs between traces (delta %" PRIu64 " ns). Choosing one arbitrarily.\n",
                                diff_ns < 0 ? -diff_ns : diff_ns);
                        if (diff_ns > 10000) {
                                fprintf(stderr, "[warning] Clock \"%s\" offset differs between traces (delta %" PRIu64 " ns). Choosing one arbitrarily.\n",
-                               g_quark_to_string(tc_clock->name),
-                               diff_ns < 0 ? -diff_ns : diff_ns);
+                                       g_quark_to_string(tc_clock->name),
+                                       diff_ns < 0 ? -diff_ns : diff_ns);
                        }
                }
        }
                        }
                }
        }
@@ -408,11 +420,13 @@ static int trace_collection_add(struct trace_collection *tc,
        struct ctf_trace *trace = container_of(td, struct ctf_trace, parent);
 
        g_ptr_array_add(tc->array, td);
        struct ctf_trace *trace = container_of(td, struct ctf_trace, parent);
 
        g_ptr_array_add(tc->array, td);
+       trace->collection = tc;
 
        if (tc->array->len > 1) {
                struct clock_match clock_match = {
                        .clocks = tc->clocks,
                        .clock_match = NULL,
 
        if (tc->array->len > 1) {
                struct clock_match clock_match = {
                        .clocks = tc->clocks,
                        .clock_match = NULL,
+                       .tc = NULL,
                };
 
                /*
                };
 
                /*
@@ -427,13 +441,22 @@ static int trace_collection_add(struct trace_collection *tc,
                        goto error;
                }
        }
                        goto error;
                }
        }
-       /*
-        * Add each clock from the trace clocks into the trace
-        * collection clocks.
-        */
-       g_hash_table_foreach(trace->clocks,
-                       clock_add,
-                       tc->clocks);
+
+       {
+               struct clock_match clock_match = {
+                       .clocks = tc->clocks,
+                       .clock_match = NULL,
+                       .tc = tc,
+               };
+
+               /*
+                * Add each clock from the trace clocks into the trace
+                * collection clocks.
+                */
+               g_hash_table_foreach(trace->clocks,
+                               clock_add,
+                               &clock_match);
+       }
        return 0;
 error:
        return -EPERM;
        return 0;
 error:
        return -EPERM;
index 35b26235714b236c31625b2797d41815561c739b..e4d7682c0ee27d0d6bac6381c52933f1a9911807 100644 (file)
@@ -162,15 +162,16 @@ void ctf_text_print_timestamp(struct ctf_text_stream_pos *pos,
                        struct ctf_stream *stream)
 {
        uint64_t ts_sec = 0, ts_nsec;
                        struct ctf_stream *stream)
 {
        uint64_t ts_sec = 0, ts_nsec;
-       //need to get the clock offset at trace collection level. TODO
-       //struct ctf_trace *trace = stream->stream_class->trace;
+       struct ctf_trace *trace = stream->stream_class->trace;
+       struct trace_collection *tc = trace->collection;
+       struct ctf_clock *clock = tc->single_clock;
 
        ts_nsec = stream->timestamp;
 
        /* Add offsets */
 
        ts_nsec = stream->timestamp;
 
        /* Add offsets */
-       if (!opt_clock_raw) {
-               //ts_sec += pos->clock_offset_s;
-               //ts_nsec += pos->clock_offset;
+       if (!opt_clock_raw && clock) {
+               ts_sec += clock->offset_s;
+               ts_nsec += clock->offset;
        }
        ts_sec += opt_clock_offset;
 
        }
        ts_sec += opt_clock_offset;
 
index 707c06065bdcf04c93ac850d0a772f2c747a2226..913b043cf9d0b46b345015b9619c7c7755fac0be 100644 (file)
@@ -26,6 +26,7 @@ struct trace_descriptor;
 struct trace_collection {
        GPtrArray *array;       /* struct trace_descriptor */
        GHashTable *clocks;     /* struct ctf_clock */
 struct trace_collection {
        GPtrArray *array;       /* struct trace_descriptor */
        GHashTable *clocks;     /* struct ctf_clock */
+       struct ctf_clock *single_clock;
 };
 
 extern int opt_all_field_names,
 };
 
 extern int opt_all_field_names,
index bf68c328b39be7da47e1f36afe02e6e52f3d530c..773ebd681358b01196385460242311323eeecd92 100644 (file)
@@ -114,6 +114,7 @@ struct ctf_trace {
        GPtrArray *streams;                     /* Array of struct ctf_stream_class pointers */
        struct ctf_stream *metadata;
        GHashTable *clocks;
        GPtrArray *streams;                     /* Array of struct ctf_stream_class pointers */
        struct ctf_stream *metadata;
        GHashTable *clocks;
+       struct trace_collection *collection;    /* Container of this trace */
 
        struct declaration_struct *packet_header_decl;
 
 
        struct declaration_struct *packet_header_decl;
 
This page took 0.026978 seconds and 4 git commands to generate.