diff options
author | Pierre Gondois <pierre.gondois@arm.com> | 2024-01-22 17:43:31 +0100 |
---|---|---|
committer | Steven Rostedt (Google) <rostedt@goodmis.org> | 2024-01-22 18:45:45 -0500 |
commit | 1439b8f5189414b259905102da23446ba78db033 (patch) | |
tree | 74d1d4a341901209055a371cb027c735f92ba47e | |
parent | 39f57e7abd4784eea3111de38843453fb3448625 (diff) | |
download | trace-cmd-1439b8f5189414b259905102da23446ba78db033.tar.gz |
trace-cmd split: Correctly split with start/end/time-window parameters
With a trace.dat file having events timestamped between
[284443.0, 284448.0] seconds, the following command:
trace-cmd split -i trace.dat -o trace2.dat -r -m 100 284444 284445
should produce ten trace2.dat.XXX files between [284444.0, 284445.0],
each one lasting 100ms.
Currently only one trace2.dat.001 file is produced, with events
within the [284444.0, 284445.1] time window.
Don't stop splitting the input file after the first iteration.
Add a end_reached to detect when the end timestamp is reached.
Link: https://lore.kernel.org/linux-trace-devel/20240122164336.167256-3-pierre.gondois@arm.com
Signed-off-by: Pierre Gondois <pierre.gondois@arm.com>
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
-rw-r--r-- | tracecmd/trace-split.c | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/tracecmd/trace-split.c b/tracecmd/trace-split.c index 6ccda2fc..b6c056b5 100644 --- a/tracecmd/trace-split.c +++ b/tracecmd/trace-split.c @@ -198,7 +198,7 @@ static int parse_cpu(struct tracecmd_input *handle, unsigned long long start, unsigned long long end, int count_limit, int percpu, int cpu, - enum split_types type) + enum split_types type, bool *end_reached) { struct tep_record *record; struct tep_handle *pevent; @@ -325,6 +325,9 @@ static int parse_cpu(struct tracecmd_input *handle, } } + if (record && (record->ts > end)) + *end_reached = true; + if (record) tracecmd_free_record(record); @@ -352,7 +355,8 @@ static unsigned long long parse_file(struct tracecmd_input *handle, unsigned long long start, unsigned long long end, int percpu, int only_cpu, int count, - enum split_types type) + enum split_types type, + bool *end_reached) { unsigned long long current; struct tracecmd_output *ohandle; @@ -396,14 +400,14 @@ static unsigned long long parse_file(struct tracecmd_input *handle, if (only_cpu >= 0) { parse_cpu(handle, cpu_data, start, end, count, - 1, only_cpu, type); + 1, only_cpu, type, end_reached); } else if (percpu) { for (cpu = 0; cpu < cpus; cpu++) parse_cpu(handle, cpu_data, start, - end, count, percpu, cpu, type); + end, count, percpu, cpu, type, end_reached); } else parse_cpu(handle, cpu_data, start, - end, count, percpu, -1, type); + end, count, percpu, -1, type, end_reached); cpu_list = malloc(sizeof(*cpu_list) * cpus); if (!cpu_list) @@ -415,7 +419,6 @@ static unsigned long long parse_file(struct tracecmd_input *handle, if (tracecmd_append_cpu_data(ohandle, cpus, cpu_list) < 0) die("Failed to append tracing data\n"); - current = end; for (cpu = 0; cpu < cpus; cpu++) { /* Set the tracecmd cursor to the next set of records */ if (cpu_data[cpu].offset) { @@ -440,6 +443,7 @@ void trace_split (int argc, char **argv) struct tracecmd_input *handle; unsigned long long start_ns = 0, end_ns = 0; unsigned long long current; + bool end_reached = false; double start, end; char *endptr; char *output = NULL; @@ -564,11 +568,12 @@ void trace_split (int argc, char **argv) strcpy(output_file, output); current = parse_file(handle, output_file, start_ns, end_ns, - percpu, cpu, count, type); + percpu, cpu, count, type, &end_reached); + if (!repeat) break; start_ns = 0; - } while (current && (!end_ns || current < end_ns)); + } while (!end_reached && (current && (!end_ns || current < end_ns))); free(output); free(output_file); |