diff options
author | Arnaldo Carvalho de Melo <acme@redhat.com> | 2016-04-08 10:32:15 -0400 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2016-05-12 09:22:54 -0400 |
commit | 2515e614834f362eed36fb5ea5d359d94a525263 (patch) | |
tree | 2818ddfe0ae67c638e73d5482d0f2accffe13f71 | |
parent | 9f448cd3cbcec8995935e60b27802ae56aac8cc0 (diff) |
perf tools: Use readdir() instead of deprecated readdir_r()
The readdir() function is thread safe as long as just one thread uses a
DIR, which is the case when synthesizing events for pre-existing threads
by traversing /proc, so, to avoid breaking the build with glibc-2.23.90
(upcoming 2.24), use it instead of readdir_r().
See: http://man7.org/linux/man-pages/man3/readdir.3.html
"However, in modern implementations (including the glibc implementation),
concurrent calls to readdir() that specify different directory streams
are thread-safe. In cases where multiple threads must read from the
same directory stream, using readdir() with external synchronization is
still preferable to the use of the deprecated readdir_r(3) function."
Noticed while building on a Fedora Rawhide docker container.
CC /tmp/build/perf/util/event.o
util/event.c: In function '__event__synthesize_thread':
util/event.c:466:2: error: 'readdir_r' is deprecated [-Werror=deprecated-declarations]
while (!readdir_r(tasks, &dirent, &next) && next) {
^~~~~
In file included from /usr/include/features.h:368:0,
from /usr/include/stdint.h:25,
from /usr/lib/gcc/x86_64-redhat-linux/6.0.0/include/stdint.h:9,
from /git/linux/tools/include/linux/types.h:6,
from util/event.c:1:
/usr/include/dirent.h:189:12: note: declared here
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Wang Nan <wangnan0@huawei.com>
Link: http://lkml.kernel.org/n/tip-i1vj7nyjp2p750rirxgrfd3c@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
-rw-r--r-- | tools/perf/util/event.c | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c index dad55d04ffdd..edcf4ed4e99c 100644 --- a/tools/perf/util/event.c +++ b/tools/perf/util/event.c | |||
@@ -433,7 +433,7 @@ static int __event__synthesize_thread(union perf_event *comm_event, | |||
433 | { | 433 | { |
434 | char filename[PATH_MAX]; | 434 | char filename[PATH_MAX]; |
435 | DIR *tasks; | 435 | DIR *tasks; |
436 | struct dirent dirent, *next; | 436 | struct dirent *dirent; |
437 | pid_t tgid, ppid; | 437 | pid_t tgid, ppid; |
438 | int rc = 0; | 438 | int rc = 0; |
439 | 439 | ||
@@ -462,11 +462,11 @@ static int __event__synthesize_thread(union perf_event *comm_event, | |||
462 | return 0; | 462 | return 0; |
463 | } | 463 | } |
464 | 464 | ||
465 | while (!readdir_r(tasks, &dirent, &next) && next) { | 465 | while ((dirent = readdir(tasks)) != NULL) { |
466 | char *end; | 466 | char *end; |
467 | pid_t _pid; | 467 | pid_t _pid; |
468 | 468 | ||
469 | _pid = strtol(dirent.d_name, &end, 10); | 469 | _pid = strtol(dirent->d_name, &end, 10); |
470 | if (*end) | 470 | if (*end) |
471 | continue; | 471 | continue; |
472 | 472 | ||
@@ -575,7 +575,7 @@ int perf_event__synthesize_threads(struct perf_tool *tool, | |||
575 | { | 575 | { |
576 | DIR *proc; | 576 | DIR *proc; |
577 | char proc_path[PATH_MAX]; | 577 | char proc_path[PATH_MAX]; |
578 | struct dirent dirent, *next; | 578 | struct dirent *dirent; |
579 | union perf_event *comm_event, *mmap_event, *fork_event; | 579 | union perf_event *comm_event, *mmap_event, *fork_event; |
580 | int err = -1; | 580 | int err = -1; |
581 | 581 | ||
@@ -600,9 +600,9 @@ int perf_event__synthesize_threads(struct perf_tool *tool, | |||
600 | if (proc == NULL) | 600 | if (proc == NULL) |
601 | goto out_free_fork; | 601 | goto out_free_fork; |
602 | 602 | ||
603 | while (!readdir_r(proc, &dirent, &next) && next) { | 603 | while ((dirent = readdir(proc)) != NULL) { |
604 | char *end; | 604 | char *end; |
605 | pid_t pid = strtol(dirent.d_name, &end, 10); | 605 | pid_t pid = strtol(dirent->d_name, &end, 10); |
606 | 606 | ||
607 | if (*end) /* only interested in proper numerical dirents */ | 607 | if (*end) /* only interested in proper numerical dirents */ |
608 | continue; | 608 | continue; |