From: David Ahern <dsah...@gmail.com>

Add function to parse a user time string of the form <start>,<stop>
where start and stop are time in sec.nsec format. Both start and stop
times are optional.

Add function to determine if a sample time is within a given time
time window of interest.

Signed-off-by: David Ahern <dsah...@gmail.com>
---
 tools/perf/util/Build        |  1 +
 tools/perf/util/time-utils.c | 85 ++++++++++++++++++++++++++++++++++++++++++++
 tools/perf/util/time-utils.h | 12 +++++++
 3 files changed, 98 insertions(+)
 create mode 100644 tools/perf/util/time-utils.c
 create mode 100644 tools/perf/util/time-utils.h

diff --git a/tools/perf/util/Build b/tools/perf/util/Build
index 1dc67efad634..78f139978e7a 100644
--- a/tools/perf/util/Build
+++ b/tools/perf/util/Build
@@ -87,6 +87,7 @@ libperf-y += help-unknown-cmd.o
 libperf-y += mem-events.o
 libperf-y += vsprintf.o
 libperf-y += drv_configs.o
+libperf-y += time-utils.o
 
 libperf-$(CONFIG_LIBBPF) += bpf-loader.o
 libperf-$(CONFIG_BPF_PROLOGUE) += bpf-prologue.o
diff --git a/tools/perf/util/time-utils.c b/tools/perf/util/time-utils.c
new file mode 100644
index 000000000000..e584aeae9834
--- /dev/null
+++ b/tools/perf/util/time-utils.c
@@ -0,0 +1,85 @@
+#include <string.h>
+#include <sys/time.h>
+#include <time.h>
+#include <errno.h>
+#include <inttypes.h>
+
+#include "../perf.h"
+#include "debug.h"
+#include "time-utils.h"
+#include "util.h"
+
+static int parse_timestr_sec_nsec(struct perf_time *ptime,
+                                 char *start_str, char *end_str)
+{
+       if (start_str && (*start_str != '\0') &&
+           (parse_nsec_time(start_str, &ptime->start) != 0)) {
+               return -1;
+       }
+
+       if (end_str && (*end_str != '\0') &&
+           (parse_nsec_time(end_str, &ptime->end) != 0)) {
+               return -1;
+       }
+
+       return 0;
+}
+
+int perf_time__parse_str(struct perf_time *ptime, const char *ostr)
+{
+       char *start_str, *end_str;
+       char *d, *str;
+       int rc = 0;
+
+       if (ostr == NULL || *ostr == '\0')
+               return 0;
+
+       /* copy original string because we need to modify it */
+       str = strdup(ostr);
+       if (str == NULL)
+               return -ENOMEM;
+
+       ptime->start = 0;
+       ptime->end = 0;
+
+       /* str has the format: <start>,<stop>
+        * variations: <start>,
+        *             ,<stop>
+        *             ,
+        */
+       start_str = str;
+       d = strchr(start_str, ',');
+       if (d) {
+               *d = '\0';
+               ++d;
+       }
+       end_str = d;
+
+       rc = parse_timestr_sec_nsec(ptime, start_str, end_str);
+
+       free(str);
+
+       /* make sure end time is after start time if it was given */
+       if (rc == 0 && ptime->end && ptime->end < ptime->start)
+               return -EINVAL;
+
+       pr_debug("start time %" PRIu64 ", ", ptime->start);
+       pr_debug("end time %" PRIu64 "\n", ptime->end);
+
+       return rc;
+}
+
+bool perf_time__skip_sample(struct perf_time *ptime, u64 timestamp)
+{
+       /* if time is not set don't drop sample */
+       if (timestamp == 0)
+               return false;
+
+       /* otherwise compare sample time to time window */
+       if ((ptime->start && timestamp < ptime->start) ||
+           (ptime->end && timestamp > ptime->end)) {
+               return true;
+       }
+
+       return false;
+}
diff --git a/tools/perf/util/time-utils.h b/tools/perf/util/time-utils.h
new file mode 100644
index 000000000000..4368a481251d
--- /dev/null
+++ b/tools/perf/util/time-utils.h
@@ -0,0 +1,12 @@
+#ifndef _TIME_UTILS_H_
+#define _TIME_UTILS_H_
+
+struct perf_time {
+       u64 start, end;
+};
+
+int perf_time__parse_str(struct perf_time *ptime, const char *ostr);
+
+bool perf_time__skip_sample(struct perf_time *ptime, u64 timestamp);
+
+#endif
-- 
2.7.4 (Apple Git-66)

Reply via email to