|
@@ -92,7 +92,7 @@ struct thread_map *thread_map__new_by_tid(pid_t tid)
|
|
return threads;
|
|
return threads;
|
|
}
|
|
}
|
|
|
|
|
|
-struct thread_map *thread_map__new_by_uid(uid_t uid)
|
|
|
|
|
|
+static struct thread_map *__thread_map__new_all_cpus(uid_t uid)
|
|
{
|
|
{
|
|
DIR *proc;
|
|
DIR *proc;
|
|
int max_threads = 32, items, i;
|
|
int max_threads = 32, items, i;
|
|
@@ -113,7 +113,6 @@ struct thread_map *thread_map__new_by_uid(uid_t uid)
|
|
while ((dirent = readdir(proc)) != NULL) {
|
|
while ((dirent = readdir(proc)) != NULL) {
|
|
char *end;
|
|
char *end;
|
|
bool grow = false;
|
|
bool grow = false;
|
|
- 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 */
|
|
@@ -121,11 +120,12 @@ struct thread_map *thread_map__new_by_uid(uid_t uid)
|
|
|
|
|
|
snprintf(path, sizeof(path), "/proc/%s", dirent->d_name);
|
|
snprintf(path, sizeof(path), "/proc/%s", dirent->d_name);
|
|
|
|
|
|
- if (stat(path, &st) != 0)
|
|
|
|
- continue;
|
|
|
|
|
|
+ if (uid != UINT_MAX) {
|
|
|
|
+ struct stat st;
|
|
|
|
|
|
- if (st.st_uid != uid)
|
|
|
|
- continue;
|
|
|
|
|
|
+ if (stat(path, &st) != 0 || st.st_uid != uid)
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
|
|
snprintf(path, sizeof(path), "/proc/%d/task", pid);
|
|
snprintf(path, sizeof(path), "/proc/%d/task", pid);
|
|
items = scandir(path, &namelist, filter, NULL);
|
|
items = scandir(path, &namelist, filter, NULL);
|
|
@@ -178,6 +178,16 @@ out_free_closedir:
|
|
goto out_closedir;
|
|
goto out_closedir;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+struct thread_map *thread_map__new_all_cpus(void)
|
|
|
|
+{
|
|
|
|
+ return __thread_map__new_all_cpus(UINT_MAX);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+struct thread_map *thread_map__new_by_uid(uid_t uid)
|
|
|
|
+{
|
|
|
|
+ return __thread_map__new_all_cpus(uid);
|
|
|
|
+}
|
|
|
|
+
|
|
struct thread_map *thread_map__new(pid_t pid, pid_t tid, uid_t uid)
|
|
struct thread_map *thread_map__new(pid_t pid, pid_t tid, uid_t uid)
|
|
{
|
|
{
|
|
if (pid != -1)
|
|
if (pid != -1)
|