diff options
Diffstat (limited to 'tools/perf/util/thread.c')
| -rw-r--r-- | tools/perf/util/thread.c | 43 |
1 files changed, 29 insertions, 14 deletions
diff --git a/tools/perf/util/thread.c b/tools/perf/util/thread.c index 8c72d888e449..00f4eade2e3e 100644 --- a/tools/perf/util/thread.c +++ b/tools/perf/util/thread.c | |||
| @@ -16,35 +16,50 @@ static int filter(const struct dirent *dir) | |||
| 16 | return 1; | 16 | return 1; |
| 17 | } | 17 | } |
| 18 | 18 | ||
| 19 | int find_all_tid(int pid, pid_t ** all_tid) | 19 | struct thread_map *thread_map__new_by_pid(pid_t pid) |
| 20 | { | 20 | { |
| 21 | struct thread_map *threads; | ||
| 21 | char name[256]; | 22 | char name[256]; |
| 22 | int items; | 23 | int items; |
| 23 | struct dirent **namelist = NULL; | 24 | struct dirent **namelist = NULL; |
| 24 | int ret = 0; | ||
| 25 | int i; | 25 | int i; |
| 26 | 26 | ||
| 27 | sprintf(name, "/proc/%d/task", pid); | 27 | sprintf(name, "/proc/%d/task", pid); |
| 28 | items = scandir(name, &namelist, filter, NULL); | 28 | items = scandir(name, &namelist, filter, NULL); |
| 29 | if (items <= 0) | 29 | if (items <= 0) |
| 30 | return -ENOENT; | 30 | return NULL; |
| 31 | *all_tid = malloc(sizeof(pid_t) * items); | ||
| 32 | if (!*all_tid) { | ||
| 33 | ret = -ENOMEM; | ||
| 34 | goto failure; | ||
| 35 | } | ||
| 36 | |||
| 37 | for (i = 0; i < items; i++) | ||
| 38 | (*all_tid)[i] = atoi(namelist[i]->d_name); | ||
| 39 | 31 | ||
| 40 | ret = items; | 32 | threads = malloc(sizeof(*threads) + sizeof(pid_t) * items); |
| 33 | if (threads != NULL) { | ||
| 34 | for (i = 0; i < items; i++) | ||
| 35 | threads->map[i] = atoi(namelist[i]->d_name); | ||
| 36 | threads->nr = items; | ||
| 37 | } | ||
| 41 | 38 | ||
| 42 | failure: | ||
| 43 | for (i=0; i<items; i++) | 39 | for (i=0; i<items; i++) |
| 44 | free(namelist[i]); | 40 | free(namelist[i]); |
| 45 | free(namelist); | 41 | free(namelist); |
| 46 | 42 | ||
| 47 | return ret; | 43 | return threads; |
| 44 | } | ||
| 45 | |||
| 46 | struct thread_map *thread_map__new_by_tid(pid_t tid) | ||
| 47 | { | ||
| 48 | struct thread_map *threads = malloc(sizeof(*threads) + sizeof(pid_t)); | ||
| 49 | |||
| 50 | if (threads != NULL) { | ||
| 51 | threads->map[0] = tid; | ||
| 52 | threads->nr = 1; | ||
| 53 | } | ||
| 54 | |||
| 55 | return threads; | ||
| 56 | } | ||
| 57 | |||
| 58 | struct thread_map *thread_map__new(pid_t pid, pid_t tid) | ||
| 59 | { | ||
| 60 | if (pid != -1) | ||
| 61 | return thread_map__new_by_pid(pid); | ||
| 62 | return thread_map__new_by_tid(tid); | ||
| 48 | } | 63 | } |
| 49 | 64 | ||
| 50 | static struct thread *thread__new(pid_t pid) | 65 | static struct thread *thread__new(pid_t pid) |
