perf tools: Use readdir() instead of deprecated readdir_r()
tip-bot for Arnaldo Carvalho de Melo
merge botCommit-ID: 7093b4c963cc4e344e490c774924a180602a7092 Gitweb: http://git.kernel.org/tip/7093b4c963cc4e344e490c774924a180602a7092 Author: Arnaldo Carvalho de Melo <[email protected]> AuthorDate: Fri, 8 Apr 2016 11:32:15 -0300 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Fri, 8 Apr 2016 11:32:15 -0300
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
--- tools/perf/util/event.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
tools/perf/util/event.c +6 -6
@@ -434,7 +434,7 @@ static int __event__synthesize_thread(union perf_event *comm_event, {char filename[PATH_MAX ];DIR *tasks; -struct dirent dirent, *next; +struct dirent *dirent;pid_t tgid, ppid;int rc =0 ;
@@ -463,11 +463,11 @@ static int __event__synthesize_thread(union perf_event *comm_event,return 0 ; } -while (!readdir_r (tasks, &dirent, &next) && next) { +while ((dirent =readdir (tasks)) !=NULL ) {char *end;pid_t _pid; - _pid =strtol (dirent.d_name, &end,10 ); + _pid =strtol (dirent->d_name, &end,10 );if (*end)continue ;
@@ -576,7 +576,7 @@ int perf_event__synthesize_threads(struct perf_tool *tool, {DIR *proc;char proc_path[PATH_MAX ]; -struct dirent dirent, *next; +struct dirent *dirent;union perf_event *comm_event, *mmap_event, *fork_event;int err =-1 ;
@@ -601,9 +601,9 @@ int perf_event__synthesize_threads(struct perf_tool *tool,if (proc ==NULL ) goto out_free_fork; -while (!readdir_r (proc, &dirent, &next) && next) { +while ((dirent =readdir (proc)) !=NULL ) {char *end; -pid_t pid =strtol (dirent.d_name, &end,10 ); +pid_t pid =strtol (dirent->d_name, &end,10 );if (*end)/* only interested in proper numerical dirents */ continue ;