From: Mathieu Desnoyers Date: Mon, 30 Jan 2012 17:53:50 +0000 (-0500) Subject: Add clock offset support X-Git-Tag: v0.9~16 X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=commitdiff_plain;h=fa709ab2ef8c8331fcccb6408fc7740918fc286d Add clock offset support Signed-off-by: Mathieu Desnoyers --- diff --git a/converter/babeltrace.c b/converter/babeltrace.c index 0cdd42e3..22ec9244 100644 --- a/converter/babeltrace.c +++ b/converter/babeltrace.c @@ -323,6 +323,7 @@ static void finalize_trace_collection(struct trace_collection *tc) 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) @@ -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) { - 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; @@ -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) { + /* + * 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); @@ -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", - 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); + trace->collection = tc; 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; } } - /* - * 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; diff --git a/formats/ctf-text/ctf-text.c b/formats/ctf-text/ctf-text.c index 35b26235..e4d7682c 100644 --- a/formats/ctf-text/ctf-text.c +++ b/formats/ctf-text/ctf-text.c @@ -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; - //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 */ - 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; diff --git a/include/babeltrace/babeltrace-internal.h b/include/babeltrace/babeltrace-internal.h index 707c0606..913b043c 100644 --- a/include/babeltrace/babeltrace-internal.h +++ b/include/babeltrace/babeltrace-internal.h @@ -26,6 +26,7 @@ struct trace_descriptor; struct trace_collection { GPtrArray *array; /* struct trace_descriptor */ GHashTable *clocks; /* struct ctf_clock */ + struct ctf_clock *single_clock; }; extern int opt_all_field_names, diff --git a/include/babeltrace/ctf-ir/metadata.h b/include/babeltrace/ctf-ir/metadata.h index bf68c328..773ebd68 100644 --- a/include/babeltrace/ctf-ir/metadata.h +++ b/include/babeltrace/ctf-ir/metadata.h @@ -114,6 +114,7 @@ struct ctf_trace { 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;