OSDN Git Service

perf time-utils: Refactor time range parsing code
[uclinux-h8/linux.git] / tools / perf / util / time-utils.c
index 6193b46..0f53bae 100644 (file)
@@ -11,6 +11,8 @@
 #include "perf.h"
 #include "debug.h"
 #include "time-utils.h"
+#include "session.h"
+#include "evlist.h"
 
 int parse_nsec_time(const char *str, u64 *ptime)
 {
@@ -374,7 +376,7 @@ bool perf_time__ranges_skip_sample(struct perf_time_interval *ptime_buf,
        struct perf_time_interval *ptime;
        int i;
 
-       if ((timestamp == 0) || (num == 0))
+       if ((!ptime_buf) || (timestamp == 0) || (num == 0))
                return false;
 
        if (num == 1)
@@ -396,6 +398,53 @@ bool perf_time__ranges_skip_sample(struct perf_time_interval *ptime_buf,
        return (i == num) ? true : false;
 }
 
+int perf_time__parse_for_ranges(const char *time_str,
+                               struct perf_session *session,
+                               struct perf_time_interval **ranges,
+                               int *range_size, int *range_num)
+{
+       struct perf_time_interval *ptime_range;
+       int size, num, ret;
+
+       ptime_range = perf_time__range_alloc(time_str, &size);
+       if (!ptime_range)
+               return -ENOMEM;
+
+       if (perf_time__parse_str(ptime_range, time_str) != 0) {
+               if (session->evlist->first_sample_time == 0 &&
+                   session->evlist->last_sample_time == 0) {
+                       pr_err("HINT: no first/last sample time found in perf data.\n"
+                              "Please use latest perf binary to execute 'perf record'\n"
+                              "(if '--buildid-all' is enabled, please set '--timestamp-boundary').\n");
+                       ret = -EINVAL;
+                       goto error;
+               }
+
+               num = perf_time__percent_parse_str(
+                               ptime_range, size,
+                               time_str,
+                               session->evlist->first_sample_time,
+                               session->evlist->last_sample_time);
+
+               if (num < 0) {
+                       pr_err("Invalid time string\n");
+                       ret = -EINVAL;
+                       goto error;
+               }
+       } else {
+               num = 1;
+       }
+
+       *range_size = size;
+       *range_num = num;
+       *ranges = ptime_range;
+       return 0;
+
+error:
+       free(ptime_range);
+       return ret;
+}
+
 int timestamp__scnprintf_usec(u64 timestamp, char *buf, size_t sz)
 {
        u64  sec = timestamp / NSEC_PER_SEC;