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.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
Родитель
5a3d04d6dc
Коммит
ffe0fb769a
|
@ -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)
|
||||||
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)
|
||||||
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 {
|
||||||
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);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче