mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-06 14:48:06 +00:00
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>
This commit is contained in:
parent
9a5f3bf332
commit
7839b9f32e
1 changed files with 4 additions and 4 deletions
|
@ -94,7 +94,7 @@ struct thread_map *thread_map__new_by_uid(uid_t uid)
|
||||||
DIR *proc;
|
DIR *proc;
|
||||||
int max_threads = 32, items, i;
|
int max_threads = 32, items, i;
|
||||||
char path[256];
|
char path[256];
|
||||||
struct dirent dirent, *next, **namelist = NULL;
|
struct dirent *dirent, **namelist = NULL;
|
||||||
struct thread_map *threads = thread_map__alloc(max_threads);
|
struct thread_map *threads = thread_map__alloc(max_threads);
|
||||||
|
|
||||||
if (threads == NULL)
|
if (threads == NULL)
|
||||||
|
@ -107,16 +107,16 @@ struct thread_map *thread_map__new_by_uid(uid_t uid)
|
||||||
threads->nr = 0;
|
threads->nr = 0;
|
||||||
atomic_set(&threads->refcnt, 1);
|
atomic_set(&threads->refcnt, 1);
|
||||||
|
|
||||||
while (!readdir_r(proc, &dirent, &next) && next) {
|
while ((dirent = readdir(proc)) != NULL) {
|
||||||
char *end;
|
char *end;
|
||||||
bool grow = false;
|
bool grow = false;
|
||||||
struct stat st;
|
struct stat st;
|
||||||
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 */
|
if (*end) /* only interested in proper numerical dirents */
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
snprintf(path, sizeof(path), "/proc/%s", dirent.d_name);
|
snprintf(path, sizeof(path), "/proc/%s", dirent->d_name);
|
||||||
|
|
||||||
if (stat(path, &st) != 0)
|
if (stat(path, &st) != 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
Loading…
Add table
Reference in a new issue