----- Original Message ----- > From: "Vincent Bernat" <[email protected]> > To: [email protected] > Cc: "Vincent Bernat" <[email protected]> > Sent: Friday, September 27, 2013 4:31:04 PM > Subject: [lttng-dev] [PATCH] Add new option --seek > > From: Vincent Bernat <[email protected]> > > Add a new option --seek. It requires a parameter that specifies the > offset in seconds to seek from the beginning of the trace. This allows > a user to skip the beginning of a trace or to produce a smaller trace > to be used by other tools.
An offset in seconds seems to be somewhat arbitrary. Could we instead have a s.ns (seconds.nanoseconds) offset ? > > Signed-off-by: Vincent Bernat <[email protected]> > --- > converter/babeltrace.c | 49 > ++++++++++++++++++++++++++++++++ > doc/babeltrace.1 | 3 ++ > formats/ctf/ctf.c | 1 + > include/babeltrace/babeltrace-internal.h | 1 + > 4 files changed, 54 insertions(+) > > diff --git a/converter/babeltrace.c b/converter/babeltrace.c > index d5a7040..0ac7312 100644 > --- a/converter/babeltrace.c > +++ b/converter/babeltrace.c > @@ -99,6 +99,7 @@ enum { > OPT_CLOCK_DATE, > OPT_CLOCK_GMT, > OPT_CLOCK_FORCE_CORRELATE, > + OPT_SEEK, > }; > > /* > @@ -128,6 +129,7 @@ static struct poptOption long_options[] = { > { "clock-date", 0, POPT_ARG_NONE, NULL, OPT_CLOCK_DATE, NULL, NULL }, > { "clock-gmt", 0, POPT_ARG_NONE, NULL, OPT_CLOCK_GMT, NULL, NULL }, > { "clock-force-correlate", 0, POPT_ARG_NONE, NULL, > OPT_CLOCK_FORCE_CORRELATE, NULL, NULL }, > + { "seek", 0, POPT_ARG_STRING, NULL, OPT_SEEK, NULL, NULL }, > { NULL, 0, 0, NULL, 0, NULL, NULL }, > }; > > @@ -173,6 +175,8 @@ static void usage(FILE *fp) > fprintf(fp, " --clock-gmt Print clock in GMT time > zone > (default: local time zone)\n"); > fprintf(fp, " --clock-force-correlate Assume that clocks are > inherently correlated\n"); > fprintf(fp, " across traces.\n"); > + fprintf(fp, " --seek Seek to the given > position in > seconds,\n"); > + fprintf(fp, " relative to the beginning > of > the trace.\n"); > list_formats(fp); > fprintf(fp, "\n"); > } > @@ -393,6 +397,29 @@ static int parse_options(int argc, char **argv) > opt_clock_force_correlate = 1; > break; > > + case OPT_SEEK: > + { > + char *str; > + char *endptr; > + > + str = (char *) poptGetOptArg(pc); > + if (!str) { > + fprintf(stderr, "[error] Missing --seek > argument\n"); > + ret = -EINVAL; > + goto end; > + } > + errno = 0; > + opt_seek = strtoull(str, &endptr, 0); > + if (*endptr != '\0' || str == endptr || errno != 0) { > + fprintf(stderr, "[error] Incorrect --seek > argument: %s\n", str); > + ret = -EINVAL; > + free(str); > + goto end; > + } > + free(str); > + break; > + } > + > default: > ret = -EINVAL; > goto end; > @@ -609,6 +636,7 @@ int convert_trace(struct bt_trace_descriptor *td_write, > struct bt_ctf_iter *iter; > struct ctf_text_stream_pos *sout; > struct bt_iter_pos begin_pos; > + struct bt_iter_pos seek_pos; > struct bt_ctf_event *ctf_event; > int ret; > > @@ -624,6 +652,27 @@ int convert_trace(struct bt_trace_descriptor *td_write, > ret = -1; > goto error_iter; > } > + if (opt_seek > 0) { > + /* Read the first event to be able to seek. */ > + ctf_event = bt_ctf_iter_read_event(iter); > + if (!ctf_event) { > + ret = -1; > + goto error_iter; > + } > + if (!ctf_event->parent->stream->has_timestamp) { > + fprintf(stderr, "[error] Unable to seek to %" PRIu64 ". > No timestamp.\n", > + opt_seek); > + goto end; > + } > + seek_pos.type = BT_SEEK_TIME; > + seek_pos.u.seek_time = opt_seek*1000*1000*1000 + Please don't hardcode _any_ numerical values in the code. At the very least use a define, and check if this is already defined somewhere. Thanks, Mathieu > bt_ctf_get_timestamp(ctf_event); > + ret = bt_iter_set_pos(bt_ctf_get_iter(iter), &seek_pos); > + if (ret) { > + fprintf(stderr, "[error] Unable to seek to %" PRIu64 > ".\n", > + opt_seek); > + goto end; > + } > + } > while ((ctf_event = bt_ctf_iter_read_event(iter))) { > ret = sout->parent.event_cb(&sout->parent, > ctf_event->parent->stream); > if (ret) { > diff --git a/doc/babeltrace.1 b/doc/babeltrace.1 > index 929c563..d775fd8 100644 > --- a/doc/babeltrace.1 > +++ b/doc/babeltrace.1 > @@ -71,6 +71,9 @@ Print clock date > .TP > .BR "--clock-gmt" > Print clock in GMT time zone (default: local time zone) > +.BR "--seek" > +Seek to the given position in seconds, relative to the beginning of > +the trace > .TP > > .fi > diff --git a/formats/ctf/ctf.c b/formats/ctf/ctf.c > index 947b439..078b630 100644 > --- a/formats/ctf/ctf.c > +++ b/formats/ctf/ctf.c > @@ -78,6 +78,7 @@ int opt_clock_cycles, > > uint64_t opt_clock_offset; > uint64_t opt_clock_offset_ns; > +uint64_t opt_seek; > > extern int yydebug; > > diff --git a/include/babeltrace/babeltrace-internal.h > b/include/babeltrace/babeltrace-internal.h > index 1f379ee..86eb356 100644 > --- a/include/babeltrace/babeltrace-internal.h > +++ b/include/babeltrace/babeltrace-internal.h > @@ -195,5 +195,6 @@ extern int opt_all_field_names, > > extern uint64_t opt_clock_offset; > extern uint64_t opt_clock_offset_ns; > +extern uint64_t opt_seek; > > #endif > -- > 1.8.4.rc3 > > > _______________________________________________ > lttng-dev mailing list > [email protected] > http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev > -- Mathieu Desnoyers EfficiOS Inc. http://www.efficios.com _______________________________________________ lttng-dev mailing list [email protected] http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
