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.
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 + 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
