Re: [PATCH 47/79] libperf: Add perf_evlist__for_each_evsel macro

From: Arnaldo Carvalho de Melo
Date: Wed Jul 24 2019 - 11:42:09 EST


Em Sun, Jul 21, 2019 at 01:24:34PM +0200, Jiri Olsa escreveu:
> Adding perf_evlist__for_each_evsel macro to iterate
> perf_evsel objects in evlist.
>
> Adding perf_evlist__next function to do that.

Replaced the above line in the cset commit log with:

Introduce the perf_evlist__next() function to do that without exposing
'struct perf_evlist' internals.


> Link: http://lkml.kernel.org/n/tip-usi0zxyxmai1ld94nrbum43i@xxxxxxxxxxxxxx
> Signed-off-by: Jiri Olsa <jolsa@xxxxxxxxxx>
> ---
> tools/perf/lib/evlist.c | 20 ++++++++++++++++++++
> tools/perf/lib/include/perf/evlist.h | 7 +++++++
> tools/perf/lib/libperf.map | 1 +
> 3 files changed, 28 insertions(+)
>
> diff --git a/tools/perf/lib/evlist.c b/tools/perf/lib/evlist.c
> index 0517deb4cb1c..8c26ebf290f0 100644
> --- a/tools/perf/lib/evlist.c
> +++ b/tools/perf/lib/evlist.c
> @@ -34,3 +34,23 @@ struct perf_evlist *perf_evlist__new(void)
>
> return evlist;
> }
> +
> +struct perf_evsel*
> +perf_evlist__next(struct perf_evlist *evlist, struct perf_evsel *prev)
> +{
> + struct perf_evsel *next;
> +
> + if (!prev) {
> + next = list_first_entry(&evlist->entries,
> + struct perf_evsel,
> + node);
> + } else {
> + next = list_next_entry(prev, node);
> + }
> +
> + /* Empty list is noticed here so don't need checking on entry. */
> + if (&next->node == &evlist->entries)
> + return NULL;
> +
> + return next;
> +}
> diff --git a/tools/perf/lib/include/perf/evlist.h b/tools/perf/lib/include/perf/evlist.h
> index 7255a60869a1..5092b622935b 100644
> --- a/tools/perf/lib/include/perf/evlist.h
> +++ b/tools/perf/lib/include/perf/evlist.h
> @@ -13,5 +13,12 @@ LIBPERF_API void perf_evlist__add(struct perf_evlist *evlist,
> LIBPERF_API void perf_evlist__remove(struct perf_evlist *evlist,
> struct perf_evsel *evsel);
> LIBPERF_API struct perf_evlist *perf_evlist__new(void);
> +LIBPERF_API struct perf_evsel* perf_evlist__next(struct perf_evlist *evlist,
> + struct perf_evsel *evsel);
> +
> +#define perf_evlist__for_each_evsel(evlist, pos) \
> + for ((pos) = perf_evlist__next((evlist), NULL); \
> + (pos) != NULL; \
> + (pos) = perf_evlist__next((evlist), (pos)))
>
> #endif /* __LIBPERF_EVLIST_H */
> diff --git a/tools/perf/lib/libperf.map b/tools/perf/lib/libperf.map
> index e3eac9b60726..c0968226f7b6 100644
> --- a/tools/perf/lib/libperf.map
> +++ b/tools/perf/lib/libperf.map
> @@ -17,6 +17,7 @@ LIBPERF_0.0.1 {
> perf_evlist__init;
> perf_evlist__add;
> perf_evlist__remove;
> + perf_evlist__next;
> local:
> *;
> };
> --
> 2.21.0

--

- Arnaldo