perf tools: Allow passing a list to intlist__new

Just like strlist allows passing a list of entries to parse.

Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-em50vqvvmlnc6k9tw4xtixus@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 5a3d04d6
...@@ -694,7 +694,7 @@ static void perf_event__process_sample(struct perf_tool *tool, ...@@ -694,7 +694,7 @@ static void perf_event__process_sample(struct perf_tool *tool,
static struct intlist *seen; static struct intlist *seen;
if (!seen) if (!seen)
seen = intlist__new(); seen = intlist__new(NULL);
if (!intlist__has_entry(seen, event->ip.pid)) { if (!intlist__has_entry(seen, event->ip.pid)) {
pr_err("Can't find guest [%d]'s kernel information\n", pr_err("Can't find guest [%d]'s kernel information\n",
......
...@@ -73,7 +73,26 @@ struct int_node *intlist__find(struct intlist *ilist, int i) ...@@ -73,7 +73,26 @@ struct int_node *intlist__find(struct intlist *ilist, int i)
return node; return node;
} }
struct intlist *intlist__new(void) static int intlist__parse_list(struct intlist *ilist, const char *s)
{
char *sep;
int err;
do {
long value = strtol(s, &sep, 10);
err = -EINVAL;
if (*sep != ',' && *sep != '\0')
break;
err = intlist__add(ilist, value);
if (err)
break;
s = sep + 1;
} while (*sep != '\0');
return err;
}
struct intlist *intlist__new(const char *slist)
{ {
struct intlist *ilist = malloc(sizeof(*ilist)); struct intlist *ilist = malloc(sizeof(*ilist));
...@@ -82,9 +101,15 @@ struct intlist *intlist__new(void) ...@@ -82,9 +101,15 @@ struct intlist *intlist__new(void)
ilist->rblist.node_cmp = intlist__node_cmp; ilist->rblist.node_cmp = intlist__node_cmp;
ilist->rblist.node_new = intlist__node_new; ilist->rblist.node_new = intlist__node_new;
ilist->rblist.node_delete = intlist__node_delete; ilist->rblist.node_delete = intlist__node_delete;
if (slist && intlist__parse_list(ilist, slist))
goto out_delete;
} }
return ilist; return ilist;
out_delete:
intlist__delete(ilist);
return NULL;
} }
void intlist__delete(struct intlist *ilist) void intlist__delete(struct intlist *ilist)
......
...@@ -15,7 +15,7 @@ struct intlist { ...@@ -15,7 +15,7 @@ struct intlist {
struct rblist rblist; struct rblist rblist;
}; };
struct intlist *intlist__new(void); struct intlist *intlist__new(const char *slist);
void intlist__delete(struct intlist *ilist); void intlist__delete(struct intlist *ilist);
void intlist__remove(struct intlist *ilist, struct int_node *in); void intlist__remove(struct intlist *ilist, struct int_node *in);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment