From 34d9941856a9274398e63f2c2a86300dc157eafd Mon Sep 17 00:00:00 2001 From: Julien Desfossez Date: Tue, 3 Dec 2013 17:34:57 -0500 Subject: [PATCH] Fixes in babeltrace core to support non-CTF traces Since we will have an effort soon to cleanup the Babeltrace plugin mechanism, this patch adds just the bits required in Babeltrace to not crash if a non-ctf is opened. We also add the support of net:// URIs. That way, an input plugin can just implement the open_trace callback and process its own input trace without requiring a CTF iterator. Signed-off-by: Julien Desfossez Signed-off-by: Mathieu Desnoyers --- converter/babeltrace.c | 30 +++++++++++++++++++++++++----- lib/context.c | 26 +++++++++++++++++++------- lib/trace-collection.c | 3 +++ 3 files changed, 47 insertions(+), 12 deletions(-) diff --git a/converter/babeltrace.c b/converter/babeltrace.c index d5a7040c..c53c4800 100644 --- a/converter/babeltrace.c +++ b/converter/babeltrace.c @@ -57,6 +57,10 @@ #define DEFAULT_FILE_ARRAY_SIZE 1 +#define NET_URL_PREFIX "net://" +#define NET4_URL_PREFIX "net4://" +#define NET6_URL_PREFIX "net6://" + static char *opt_input_format, *opt_output_format; /* @@ -497,6 +501,19 @@ int bt_context_add_traces_recursive(struct bt_context *ctx, const char *path, { int ret = 0, trace_ids = 0; + if ((strncmp(path, NET4_URL_PREFIX, sizeof(NET4_URL_PREFIX) - 1)) == 0 || + (strncmp(path, NET6_URL_PREFIX, sizeof(NET6_URL_PREFIX) - 1)) == 0 || + (strncmp(path, NET_URL_PREFIX, sizeof(NET_URL_PREFIX) - 1)) == 0) { + ret = bt_context_add_trace(ctx, + path, format_str, packet_seek, NULL, NULL); + if (ret < 0) { + fprintf(stderr, "[warning] [Context] cannot open trace \"%s\" " + "for reading.\n", path); + /* Allow to skip erroneous traces. */ + ret = 1; /* partial error */ + } + return ret; + } /* Should lock traversed_paths mutex here if used in multithread */ traversed_paths = g_ptr_array_new(); @@ -697,7 +714,7 @@ int main(int argc, char **argv) } } fmt_read = bt_lookup_format(g_quark_from_static_string(opt_input_format)); - if (!fmt_read || fmt_read->name != g_quark_from_static_string("ctf")) { + if (!fmt_read) { fprintf(stderr, "[error] Format \"%s\" is not supported.\n\n", opt_input_format); partial_error = 1; @@ -757,10 +774,13 @@ int main(int argc, char **argv) goto error_copy_trace; } - ret = convert_trace(td_write, ctx); - if (ret) { - fprintf(stderr, "Error printing trace.\n\n"); - goto error_copy_trace; + /* For now, we support only CTF iterators */ + if (fmt_read->name == g_quark_from_static_string("ctf")) { + ret = convert_trace(td_write, ctx); + if (ret) { + fprintf(stderr, "Error printing trace.\n\n"); + goto error_copy_trace; + } } ret = trace_post_handler(td_write, ctx); diff --git a/lib/context.c b/lib/context.c index 5820fb3e..45aab34b 100644 --- a/lib/context.c +++ b/lib/context.c @@ -137,14 +137,24 @@ int bt_context_add_trace(struct bt_context *ctx, const char *path, if (ret != 0) goto error; - ret = fmt->convert_index_timestamp(td); - if (ret < 0) - goto error; + if (fmt->convert_index_timestamp) { + ret = fmt->convert_index_timestamp(td); + if (ret < 0) + goto error; + } - handle->real_timestamp_begin = fmt->timestamp_begin(td, handle, BT_CLOCK_REAL); - handle->real_timestamp_end = fmt->timestamp_end(td, handle, BT_CLOCK_REAL); - handle->cycles_timestamp_begin = fmt->timestamp_begin(td, handle, BT_CLOCK_CYCLES); - handle->cycles_timestamp_end = fmt->timestamp_end(td, handle, BT_CLOCK_CYCLES); + if (fmt->timestamp_begin) + handle->real_timestamp_begin = fmt->timestamp_begin(td, + handle, BT_CLOCK_REAL); + if (fmt->timestamp_end) + handle->real_timestamp_end = fmt->timestamp_end(td, handle, + BT_CLOCK_REAL); + if (fmt->timestamp_begin) + handle->cycles_timestamp_begin = fmt->timestamp_begin(td, + handle, BT_CLOCK_CYCLES); + if (fmt->timestamp_end) + handle->cycles_timestamp_end = fmt->timestamp_end(td, handle, + BT_CLOCK_CYCLES); return handle->id; @@ -217,6 +227,8 @@ void remove_trace_handle(struct bt_trace_handle *handle) { int ret; + if (!handle->td->ctx) + return; /* Remove from containers */ bt_trace_collection_remove(handle->td->ctx->tc, handle->td); /* Close the trace */ diff --git a/lib/trace-collection.c b/lib/trace-collection.c index b854c974..fa1497ac 100644 --- a/lib/trace-collection.c +++ b/lib/trace-collection.c @@ -161,6 +161,9 @@ int bt_trace_collection_add(struct trace_collection *tc, if (!tc || !trace) return -EINVAL; + if (!trace->clocks) + return 0; + if (tc->array->len > 1) { struct clock_match clock_match = { .clocks = tc->clocks, -- 2.34.1