Fixes in babeltrace core to support non-CTF traces
authorJulien Desfossez <jdesfossez@efficios.com>
Tue, 3 Dec 2013 22:34:57 +0000 (17:34 -0500)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Wed, 4 Dec 2013 19:29:45 +0000 (20:29 +0100)
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 <jdesfossez@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
converter/babeltrace.c
lib/context.c
lib/trace-collection.c

index d5a7040cdb33b4bc4085a2c31cb8efcd8a3b8c6a..c53c4800046923a616ef9f6d583fd7753df7b692 100644 (file)
 
 #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);
index 5820fb3e5533ba97693044ce0e419ca0382545d8..45aab34bdfc71c1b78bc9c409d42e70230b307b3 100644 (file)
@@ -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 */
index b854c97440422b009ce12111d54f136f94431515..fa1497acbfc34897924b3e58fafda0a59c0cb6e9 100644 (file)
@@ -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,
This page took 0.025827 seconds and 4 git commands to generate.