diff options
author | Arnaldo Carvalho de Melo <acme@redhat.com> | 2016-04-08 10:31:24 -0400 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2016-04-08 10:31:24 -0400 |
commit | 3354cf71104de49326d19d2f9bdb1f66eea52ef4 (patch) | |
tree | e0d9bab4e6909f3b8c66f83fc9275f1839bceea6 /tools/perf | |
parent | a5e8e825bd1704c488bf6a46936aaf3b9f203d6a (diff) |
perf thread_map: 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 in thread_map, 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: 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-del8h2a0f40z75j4r42l96l0@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf')
-rw-r--r-- | tools/perf/util/thread_map.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/tools/perf/util/thread_map.c b/tools/perf/util/thread_map.c index 08afc6909953..267112b4e3db 100644 --- a/tools/perf/util/thread_map.c +++ b/tools/perf/util/thread_map.c | |||
@@ -94,7 +94,7 @@ struct thread_map *thread_map__new_by_uid(uid_t uid) | |||
94 | DIR *proc; | 94 | DIR *proc; |
95 | int max_threads = 32, items, i; | 95 | int max_threads = 32, items, i; |
96 | char path[256]; | 96 | char path[256]; |
97 | struct dirent dirent, *next, **namelist = NULL; | 97 | struct dirent *dirent, **namelist = NULL; |
98 | struct thread_map *threads = thread_map__alloc(max_threads); | 98 | struct thread_map *threads = thread_map__alloc(max_threads); |
99 | 99 | ||
100 | if (threads == NULL) | 100 | if (threads == NULL) |
@@ -107,16 +107,16 @@ struct thread_map *thread_map__new_by_uid(uid_t uid) | |||
107 | threads->nr = 0; | 107 | threads->nr = 0; |
108 | atomic_set(&threads->refcnt, 1); | 108 | atomic_set(&threads->refcnt, 1); |
109 | 109 | ||
110 | while (!readdir_r(proc, &dirent, &next) && next) { | 110 | while ((dirent = readdir(proc)) != NULL) { |
111 | char *end; | 111 | char *end; |
112 | bool grow = false; | 112 | bool grow = false; |
113 | struct stat st; | 113 | struct stat st; |
114 | pid_t pid = strtol(dirent.d_name, &end, 10); | 114 | pid_t pid = strtol(dirent->d_name, &end, 10); |
115 | 115 | ||
116 | if (*end) /* only interested in proper numerical dirents */ | 116 | if (*end) /* only interested in proper numerical dirents */ |
117 | continue; | 117 | continue; |
118 | 118 | ||
119 | snprintf(path, sizeof(path), "/proc/%s", dirent.d_name); | 119 | snprintf(path, sizeof(path), "/proc/%s", dirent->d_name); |
120 | 120 | ||
121 | if (stat(path, &st) != 0) | 121 | if (stat(path, &st) != 0) |
122 | continue; | 122 | continue; |