X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=blobdiff_plain;f=converter%2Fbabeltrace.c;h=2701a0cd2517661122fec747e6038c3748b87f95;hp=0cdd42e3611442734efcbe13d33408c260e42ec7;hb=4c15b06b5ac992bd66c2c9900096589406462897;hpb=70accc147c2372e8fc37d244525ffccb7be73d9a diff --git a/converter/babeltrace.c b/converter/babeltrace.c index 0cdd42e3..2701a0cd 100644 --- a/converter/babeltrace.c +++ b/converter/babeltrace.c @@ -24,7 +24,7 @@ #include #include #include -#include +#include #include #include #include @@ -101,7 +101,7 @@ static void list_formats(FILE *fp) static void usage(FILE *fp) { - fprintf(fp, "BabelTrace Trace Converter %s\n\n", VERSION); + fprintf(fp, "BabelTrace Trace Viewer and Converter %s\n\n", VERSION); fprintf(fp, "usage : babeltrace [OPTIONS] INPUT \n"); fprintf(fp, "\n"); fprintf(fp, " INPUT Input trace path\n"); @@ -167,7 +167,6 @@ static int get_fields_args(poptContext *pc) { char *str, *strlist, *strctx; - opt_payload_field_names = 0; strlist = (char *) poptGetOptArg(*pc); if (!strlist) { return -EINVAL; @@ -301,6 +300,10 @@ static void init_trace_collection(struct trace_collection *tc) { tc->array = g_ptr_array_sized_new(DEFAULT_FILE_ARRAY_SIZE); tc->clocks = g_hash_table_new(g_direct_hash, g_direct_equal); + tc->single_clock_offset_avg = 0; + tc->offset_first = 0; + tc->delta_offset_first_sum = 0; + tc->offset_nr = 0; } /* @@ -323,6 +326,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 +361,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 +376,21 @@ 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 uuid or name (absolute ref). + */ + 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->offset_nr) { + clock_match->tc->offset_first = + (t_clock->offset_s * 1000000000ULL) + t_clock->offset; + clock_match->tc->delta_offset_first_sum = 0; + clock_match->tc->offset_nr++; + clock_match->tc->single_clock_offset_avg = + clock_match->tc->offset_first; + } g_hash_table_insert(tc_clocks, (gpointer) (unsigned long) v, value); @@ -390,10 +410,18 @@ static void clock_add(gpointer key, gpointer value, gpointer user_data) g_quark_to_string(tc_clock->name), 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); + fprintf(stderr, "[warning] Clock \"%s\" offset differs between traces (delta %" PRIu64 " ns). Using average.\n", + g_quark_to_string(tc_clock->name), + diff_ns < 0 ? -diff_ns : diff_ns); } + /* Compute average */ + clock_match->tc->delta_offset_first_sum += + (t_clock->offset_s * 1000000000ULL) + t_clock->offset + - clock_match->tc->offset_first; + clock_match->tc->offset_nr++; + clock_match->tc->single_clock_offset_avg = + clock_match->tc->offset_first + + (clock_match->tc->delta_offset_first_sum / clock_match->tc->offset_nr); } } } @@ -408,11 +436,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 +457,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; @@ -442,36 +481,36 @@ error: int convert_trace(struct trace_descriptor *td_write, struct bt_context *ctx) { - struct babeltrace_iter *iter; + struct bt_iter *iter; struct ctf_stream *stream; struct ctf_stream_event *event; struct ctf_text_stream_pos *sout; - struct trace_collection_pos begin_pos; + struct bt_iter_pos begin_pos; int ret; sout = container_of(td_write, struct ctf_text_stream_pos, trace_descriptor); begin_pos.type = BT_SEEK_BEGIN; - iter = babeltrace_iter_create(ctx, &begin_pos, NULL); + iter = bt_iter_create(ctx, &begin_pos, NULL); if (!iter) { ret = -1; goto error_iter; } - while (babeltrace_iter_read_event(iter, &stream, &event) == 0) { + while (bt_iter_read_event(iter, &stream, &event) == 0) { ret = sout->parent.event_cb(&sout->parent, stream); if (ret) { fprintf(stderr, "[error] Writing event failed.\n"); goto end; } - ret = babeltrace_iter_next(iter); + ret = bt_iter_next(iter); if (ret < 0) goto end; } ret = 0; end: - babeltrace_iter_destroy(iter); + bt_iter_destroy(iter); error_iter: return ret; }