perf util: Allocate time slices buffer according to number of comma
authorJin Yao <yao.jin@linux.intel.com>
Wed, 10 Jan 2018 15:00:31 +0000 (23:00 +0800)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Wed, 17 Jan 2018 13:23:36 +0000 (10:23 -0300)
Previously we use a magic number 10 to limit the number of time slices.
It's not very good.

This patch creates a new function perf_time__range_alloc() to allocate
time slices buffer. The number of buffer entries is determined by the
number of comma in string but at least it will allocate one entry even
if no comma is found.

Signed-off-by: Jin Yao <yao.jin@linux.intel.com>
Suggested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Reviewed-by: Jiri Olsa <jolsa@redhat.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Kan Liang <kan.liang@intel.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/1515596433-24653-7-git-send-email-yao.jin@linux.intel.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/time-utils.c
tools/perf/util/time-utils.h

index 5769f972c23e9e164240e73015ce6f3f602455e2..6193b46050a566a3a3752b3b955197d2b8cd6ac1 100644 (file)
@@ -325,6 +325,34 @@ int perf_time__percent_parse_str(struct perf_time_interval *ptime_buf, int num,
        return -1;
 }
 
+struct perf_time_interval *perf_time__range_alloc(const char *ostr, int *size)
+{
+       const char *p1, *p2;
+       int i = 1;
+       struct perf_time_interval *ptime;
+
+       /*
+        * At least allocate one time range.
+        */
+       if (!ostr)
+               goto alloc;
+
+       p1 = ostr;
+       while (p1 < ostr + strlen(ostr)) {
+               p2 = strchr(p1, ',');
+               if (!p2)
+                       break;
+
+               p1 = p2 + 1;
+               i++;
+       }
+
+alloc:
+       *size = i;
+       ptime = calloc(i, sizeof(*ptime));
+       return ptime;
+}
+
 bool perf_time__skip_sample(struct perf_time_interval *ptime, u64 timestamp)
 {
        /* if time is not set don't drop sample */
index 34d5eba26bf5b2c9f3dfa6d95d26524826811394..70b177d2b98c3b1f3b6c0705d559d2d188b76f2f 100644 (file)
@@ -16,6 +16,8 @@ int perf_time__parse_str(struct perf_time_interval *ptime, const char *ostr);
 int perf_time__percent_parse_str(struct perf_time_interval *ptime_buf, int num,
                                 const char *ostr, u64 start, u64 end);
 
+struct perf_time_interval *perf_time__range_alloc(const char *ostr, int *size);
+
 bool perf_time__skip_sample(struct perf_time_interval *ptime, u64 timestamp);
 
 bool perf_time__ranges_skip_sample(struct perf_time_interval *ptime_buf,