When reading a trace file, detect and store the timestamp of the first recorded event. A new API is introduced to get the first ts from an input handler: tracecmd_get_first_ts() The first ts can be used by the library users to align timestamps of the events, when displaying them. Signed-off-by: Tzvetomir Stoyanov (VMware) <tz.stoyanov@xxxxxxxxx> --- include/trace-cmd/trace-cmd.h | 1 + lib/trace-cmd/trace-input.c | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/include/trace-cmd/trace-cmd.h b/include/trace-cmd/trace-cmd.h index 162cd318..022720b0 100644 --- a/include/trace-cmd/trace-cmd.h +++ b/include/trace-cmd/trace-cmd.h @@ -37,6 +37,7 @@ int tracecmd_get_guest_cpumap(struct tracecmd_input *handle, unsigned long long trace_id, const char **name, int *vcpu_count, const int **cpu_pid); +unsigned long long tracecmd_get_first_ts(struct tracecmd_input *handle); int tracecmd_buffer_instances(struct tracecmd_input *handle); const char *tracecmd_buffer_instance_name(struct tracecmd_input *handle, int indx); struct tracecmd_input *tracecmd_buffer_instance_handle(struct tracecmd_input *handle, int indx); diff --git a/lib/trace-cmd/trace-input.c b/lib/trace-cmd/trace-input.c index bacf9ccf..284f25e8 100644 --- a/lib/trace-cmd/trace-input.c +++ b/lib/trace-cmd/trace-input.c @@ -61,6 +61,7 @@ struct cpu_data { unsigned long long offset; unsigned long long size; unsigned long long timestamp; + unsigned long long first_ts; struct list_head page_maps; struct page_map *page_map; struct page **pages; @@ -2273,6 +2274,7 @@ static int init_cpu(struct tracecmd_input *handle, int cpu) if (update_page_info(handle, cpu)) goto fail; + cpu_data->first_ts = cpu_data->timestamp; return 0; fail: @@ -4072,6 +4074,27 @@ unsigned long long tracecmd_get_traceid(struct tracecmd_input *handle) return handle->trace_id; } +/** + * tracecmd_get_first_ts - get the timestamp of the first recorded event + * @handle: input handle for the trace.dat file + * + * Returns the timestamp of the first recorded event + */ +unsigned long long tracecmd_get_first_ts(struct tracecmd_input *handle) +{ + unsigned long long ts = 0; + bool first = true; + int i; + + for (i = 0; i < handle->cpus; i++) { + if (first || ts > handle->cpu_data[i].first_ts) + ts = handle->cpu_data[i].first_ts; + first = false; + } + + return ts; +} + /** * tracecmd_get_guest_cpumap - get the mapping of guest VCPU to host process * @handle: input handle for the trace.dat file -- 2.30.2