Add new option --clock-offset-ns
[babeltrace.git] / converter / babeltrace.c
index 1fe06adf74f7aa8bd4bbd2c379f2e2c9c23f5b43..2fd371c396a9f218c575eaaff704ca2571f33656 100644 (file)
@@ -31,6 +31,7 @@
 #include <babeltrace/babeltrace.h>
 #include <babeltrace/format.h>
 #include <babeltrace/context.h>
+#include <babeltrace/context-internal.h>
 #include <babeltrace/ctf/types.h>
 #include <babeltrace/ctf/events.h>
 /* TODO: fix object model for format-agnostic callbacks */
@@ -92,6 +93,7 @@ enum {
        OPT_FIELDS,
        OPT_NO_DELTA,
        OPT_CLOCK_OFFSET,
+       OPT_CLOCK_OFFSET_NS,
        OPT_CLOCK_CYCLES,
        OPT_CLOCK_SECONDS,
        OPT_CLOCK_DATE,
@@ -120,6 +122,7 @@ static struct poptOption long_options[] = {
        { "fields", 'f', POPT_ARG_STRING, NULL, OPT_FIELDS, NULL, NULL },
        { "no-delta", 0, POPT_ARG_NONE, NULL, OPT_NO_DELTA, NULL, NULL },
        { "clock-offset", 0, POPT_ARG_STRING, NULL, OPT_CLOCK_OFFSET, NULL, NULL },
+       { "clock-offset-ns", 0, POPT_ARG_STRING, NULL, OPT_CLOCK_OFFSET_NS, NULL, NULL },
        { "clock-cycles", 0, POPT_ARG_NONE, NULL, OPT_CLOCK_CYCLES, NULL, NULL },
        { "clock-seconds", 0, POPT_ARG_NONE, NULL, OPT_CLOCK_SECONDS, NULL, NULL },
        { "clock-date", 0, POPT_ARG_NONE, NULL, OPT_CLOCK_DATE, NULL, NULL },
@@ -163,6 +166,7 @@ static void usage(FILE *fp)
        fprintf(fp, "                                     (default: trace:hostname,trace:procname,trace:vpid)\n");
        fprintf(fp, "      --clock-cycles             Timestamp in cycles\n");
        fprintf(fp, "      --clock-offset seconds     Clock offset in seconds\n");
+       fprintf(fp, "      --clock-offset-ns ns       Clock offset in nanoseconds\n");
        fprintf(fp, "      --clock-seconds            Print the timestamps as [sec.ns]\n");
        fprintf(fp, "                                 (default is: [hh:mm:ss.ns])\n");
        fprintf(fp, "      --clock-date               Print clock date\n");
@@ -356,6 +360,29 @@ static int parse_options(int argc, char **argv)
                case OPT_CLOCK_SECONDS:
                        opt_clock_seconds = 1;
                        break;
+               case OPT_CLOCK_OFFSET_NS:
+               {
+                       char *str;
+                       char *endptr;
+
+                       str = (char *) poptGetOptArg(pc);
+                       if (!str) {
+                               fprintf(stderr, "[error] Missing --clock-offset-ns argument\n");
+                               ret = -EINVAL;
+                               goto end;
+                       }
+                       errno = 0;
+                       opt_clock_offset_ns = strtoull(str, &endptr, 0);
+                       if (*endptr != '\0' || str == endptr || errno != 0) {
+                               fprintf(stderr, "[error] Incorrect --clock-offset-ns argument: %s\n", str);
+                               ret = -EINVAL;
+                               free(str);
+                               goto end;
+                       }
+                       free(str);
+                       break;
+               }
+
                case OPT_CLOCK_DATE:
                        opt_clock_date = 1;
                        break;
@@ -515,6 +542,67 @@ int bt_context_add_traces_recursive(struct bt_context *ctx, const char *path,
        return ret;
 }
 
+static
+int trace_pre_handler(struct bt_trace_descriptor *td_write,
+                 struct bt_context *ctx)
+{
+       struct ctf_text_stream_pos *sout;
+       struct trace_collection *tc;
+       int ret, i;
+
+       sout = container_of(td_write, struct ctf_text_stream_pos,
+                       trace_descriptor);
+
+       if (!sout->parent.pre_trace_cb)
+               return 0;
+
+       tc = ctx->tc;
+       for (i = 0; i < tc->array->len; i++) {
+               struct bt_trace_descriptor *td =
+                       g_ptr_array_index(tc->array, i);
+
+               ret = sout->parent.pre_trace_cb(&sout->parent, td);
+               if (ret) {
+                       fprintf(stderr, "[error] Writing to trace pre handler failed.\n");
+                       goto end;
+               }
+       }
+       ret = 0;
+end:
+       return ret;
+}
+
+static
+int trace_post_handler(struct bt_trace_descriptor *td_write,
+                 struct bt_context *ctx)
+{
+       struct ctf_text_stream_pos *sout;
+       struct trace_collection *tc;
+       int ret, i;
+
+       sout = container_of(td_write, struct ctf_text_stream_pos,
+                       trace_descriptor);
+
+       if (!sout->parent.post_trace_cb)
+               return 0;
+
+       tc = ctx->tc;
+       for (i = 0; i < tc->array->len; i++) {
+               struct bt_trace_descriptor *td =
+                       g_ptr_array_index(tc->array, i);
+
+               ret = sout->parent.post_trace_cb(&sout->parent, td);
+               if (ret) {
+                       fprintf(stderr, "[error] Writing to trace post handler failed.\n");
+                       goto end;
+               }
+       }
+       ret = 0;
+end:
+       return ret;
+}
+
+static
 int convert_trace(struct bt_trace_descriptor *td_write,
                  struct bt_context *ctx)
 {
@@ -527,6 +615,9 @@ int convert_trace(struct bt_trace_descriptor *td_write,
        sout = container_of(td_write, struct ctf_text_stream_pos,
                        trace_descriptor);
 
+       if (!sout->parent.event_cb)
+               return 0;
+
        begin_pos.type = BT_SEEK_BEGIN;
        iter = bt_ctf_iter_create(ctx, &begin_pos, NULL);
        if (!iter) {
@@ -660,12 +751,24 @@ int main(int argc, char **argv)
        if (partial_error)
                sleep(PARTIAL_ERROR_SLEEP);
 
+       ret = trace_pre_handler(td_write, ctx);
+       if (ret) {
+               fprintf(stderr, "Error in trace pre handle.\n\n");
+               goto error_copy_trace;
+       }
+
        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);
+       if (ret) {
+               fprintf(stderr, "Error in trace post handle.\n\n");
+               goto error_copy_trace;
+       }
+
        fmt_write->close_trace(td_write);
 
        bt_context_put(ctx);
This page took 0.049567 seconds and 4 git commands to generate.