tools: Pass arg to fdarray__filter's call back function
authorWang Nan <wangnan0@huawei.com>
Wed, 25 May 2016 13:44:57 +0000 (13:44 +0000)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Mon, 30 May 2016 15:41:46 +0000 (12:41 -0300)
Before this patch there's no way to pass arguments to fdarray__filter's
call back function.

This improvement will be used by 'perf record' to support unmapping ring
buffer for both main evlist and overwrite evlist. Without this patch
there's no way to track overwrite evlist from 'struct fdarray'.

Signed-off-by: Wang Nan <wangnan0@huawei.com>
Cc: He Kuang <hekuang@huawei.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Zefan Li <lizefan@huawei.com>
Cc: pi3orama@163.com
Link: http://lkml.kernel.org/r/1464183898-174512-10-git-send-email-wangnan0@huawei.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/lib/api/fd/array.c
tools/lib/api/fd/array.h
tools/perf/tests/fdarray.c
tools/perf/util/evlist.c

index 0e636c4339b89887b805413a5bc3509585b9d346..b0a035fc87b310cb745716a5bc2af2a570dced52 100644 (file)
@@ -85,7 +85,8 @@ int fdarray__add(struct fdarray *fda, int fd, short revents)
 }
 
 int fdarray__filter(struct fdarray *fda, short revents,
-                   void (*entry_destructor)(struct fdarray *fda, int fd))
+                   void (*entry_destructor)(struct fdarray *fda, int fd, void *arg),
+                   void *arg)
 {
        int fd, nr = 0;
 
@@ -95,7 +96,7 @@ int fdarray__filter(struct fdarray *fda, short revents,
        for (fd = 0; fd < fda->nr; ++fd) {
                if (fda->entries[fd].revents & revents) {
                        if (entry_destructor)
-                               entry_destructor(fda, fd);
+                               entry_destructor(fda, fd, arg);
 
                        continue;
                }
index 45db01818f45c92bca6588eae4f2058b4a67bc73..e87fd800fa8d38f0400e352280a70761afd518ee 100644 (file)
@@ -34,7 +34,8 @@ void fdarray__delete(struct fdarray *fda);
 int fdarray__add(struct fdarray *fda, int fd, short revents);
 int fdarray__poll(struct fdarray *fda, int timeout);
 int fdarray__filter(struct fdarray *fda, short revents,
-                   void (*entry_destructor)(struct fdarray *fda, int fd));
+                   void (*entry_destructor)(struct fdarray *fda, int fd, void *arg),
+                   void *arg);
 int fdarray__grow(struct fdarray *fda, int extra);
 int fdarray__fprintf(struct fdarray *fda, FILE *fp);
 
index c809463edbe51b96891f30bba13226c8f3f9ad99..59dbd0550c5171f88d695eff03fec9e0b542baba 100644 (file)
@@ -36,7 +36,7 @@ int test__fdarray__filter(int subtest __maybe_unused)
        }
 
        fdarray__init_revents(fda, POLLIN);
-       nr_fds = fdarray__filter(fda, POLLHUP, NULL);
+       nr_fds = fdarray__filter(fda, POLLHUP, NULL, NULL);
        if (nr_fds != fda->nr_alloc) {
                pr_debug("\nfdarray__filter()=%d != %d shouldn't have filtered anything",
                         nr_fds, fda->nr_alloc);
@@ -44,7 +44,7 @@ int test__fdarray__filter(int subtest __maybe_unused)
        }
 
        fdarray__init_revents(fda, POLLHUP);
-       nr_fds = fdarray__filter(fda, POLLHUP, NULL);
+       nr_fds = fdarray__filter(fda, POLLHUP, NULL, NULL);
        if (nr_fds != 0) {
                pr_debug("\nfdarray__filter()=%d != %d, should have filtered all fds",
                         nr_fds, fda->nr_alloc);
@@ -57,7 +57,7 @@ int test__fdarray__filter(int subtest __maybe_unused)
 
        pr_debug("\nfiltering all but fda->entries[2]:");
        fdarray__fprintf_prefix(fda, "before", stderr);
-       nr_fds = fdarray__filter(fda, POLLHUP, NULL);
+       nr_fds = fdarray__filter(fda, POLLHUP, NULL, NULL);
        fdarray__fprintf_prefix(fda, " after", stderr);
        if (nr_fds != 1) {
                pr_debug("\nfdarray__filter()=%d != 1, should have left just one event", nr_fds);
@@ -78,7 +78,7 @@ int test__fdarray__filter(int subtest __maybe_unused)
 
        pr_debug("\nfiltering all but (fda->entries[0], fda->entries[3]):");
        fdarray__fprintf_prefix(fda, "before", stderr);
-       nr_fds = fdarray__filter(fda, POLLHUP, NULL);
+       nr_fds = fdarray__filter(fda, POLLHUP, NULL, NULL);
        fdarray__fprintf_prefix(fda, " after", stderr);
        if (nr_fds != 2) {
                pr_debug("\nfdarray__filter()=%d != 2, should have left just two events",
index 719729ef9d7c0c667a62826158f076d4f6b3a33c..e0f30946ed1ad5f2956f9e63fe47841b0b129622 100644 (file)
@@ -483,7 +483,8 @@ int perf_evlist__add_pollfd(struct perf_evlist *evlist, int fd)
        return __perf_evlist__add_pollfd(evlist, fd, -1, POLLIN);
 }
 
-static void perf_evlist__munmap_filtered(struct fdarray *fda, int fd)
+static void perf_evlist__munmap_filtered(struct fdarray *fda, int fd,
+                                        void *arg __maybe_unused)
 {
        struct perf_evlist *evlist = container_of(fda, struct perf_evlist, pollfd);
 
@@ -493,7 +494,7 @@ static void perf_evlist__munmap_filtered(struct fdarray *fda, int fd)
 int perf_evlist__filter_pollfd(struct perf_evlist *evlist, short revents_and_mask)
 {
        return fdarray__filter(&evlist->pollfd, revents_and_mask,
-                              perf_evlist__munmap_filtered);
+                              perf_evlist__munmap_filtered, NULL);
 }
 
 int perf_evlist__poll(struct perf_evlist *evlist, int timeout)