summaryrefslogtreecommitdiff
path: root/tools/perf/util/data-convert-json.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/perf/util/data-convert-json.c')
-rw-r--r--tools/perf/util/data-convert-json.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/tools/perf/util/data-convert-json.c b/tools/perf/util/data-convert-json.c
index 9dc1e184cf3c..787039967916 100644
--- a/tools/perf/util/data-convert-json.c
+++ b/tools/perf/util/data-convert-json.c
@@ -25,6 +25,7 @@
#include "util/session.h"
#include "util/symbol.h"
#include "util/thread.h"
+#include "util/time-utils.h"
#include "util/tool.h"
#ifdef HAVE_LIBTRACEEVENT
@@ -35,7 +36,12 @@ struct convert_json {
struct perf_tool tool;
FILE *out;
bool first;
+ struct perf_time_interval *ptime_range;
+ int range_size;
+ int range_num;
+
u64 events_count;
+ u64 skipped;
};
// Outputs a JSON-encoded string surrounded by quotes with characters escaped.
@@ -165,6 +171,11 @@ static int process_sample_event(const struct perf_tool *tool,
return -1;
}
+ if (perf_time__ranges_skip_sample(c->ptime_range, c->range_num, sample->time)) {
+ ++c->skipped;
+ return 0;
+ }
+
++c->events_count;
if (c->first)
@@ -320,6 +331,10 @@ int bt_convert__perf2json(const char *input_name, const char *output_name,
struct convert_json c = {
.first = true,
.events_count = 0,
+ .ptime_range = NULL,
+ .range_size = 0,
+ .range_num = 0,
+ .skipped = 0,
};
struct perf_data data = {
.mode = PERF_DATA_MODE_READ,
@@ -382,6 +397,15 @@ int bt_convert__perf2json(const char *input_name, const char *output_name,
goto err_session_delete;
}
+ if (opts->time_str) {
+ ret = perf_time__parse_for_ranges(opts->time_str, session,
+ &c.ptime_range,
+ &c.range_size,
+ &c.range_num);
+ if (ret < 0)
+ goto err_session_delete;
+ }
+
// The opening brace is printed manually because it isn't delimited from a
// previous value (i.e. we don't want a leading newline)
fputc('{', c.out);
@@ -411,7 +435,16 @@ int bt_convert__perf2json(const char *input_name, const char *output_name,
"[ perf data convert: Converted and wrote %.3f MB (%" PRIu64 " samples) ]\n",
(ftell(c.out)) / 1024.0 / 1024.0, c.events_count);
+ if (c.skipped) {
+ fprintf(stderr, "[ perf data convert: Skipped %" PRIu64 " samples ]\n",
+ c.skipped);
+ }
+
ret = 0;
+
+ if (c.ptime_range)
+ zfree(&c.ptime_range);
+
err_session_delete:
perf_session__delete(session);
err_fclose: