]>
Commit | Line | Data |
---|---|---|
38af91f0 | 1 | #include <stdlib.h> |
134aa44f JO |
2 | #include <sys/types.h> |
3 | #include <unistd.h> | |
8fbc38aa | 4 | #include <sys/prctl.h> |
134aa44f JO |
5 | #include "tests.h" |
6 | #include "thread_map.h" | |
7 | #include "debug.h" | |
8 | ||
8fbc38aa JO |
9 | #define NAME (const char *) "perf" |
10 | #define NAMEUL (unsigned long) NAME | |
11 | ||
721a1f53 | 12 | int test__thread_map(int subtest __maybe_unused) |
134aa44f JO |
13 | { |
14 | struct thread_map *map; | |
15 | ||
8fbc38aa JO |
16 | TEST_ASSERT_VAL("failed to set process name", |
17 | !prctl(PR_SET_NAME, NAMEUL, 0, 0, 0)); | |
18 | ||
134aa44f JO |
19 | /* test map on current pid */ |
20 | map = thread_map__new_by_pid(getpid()); | |
21 | TEST_ASSERT_VAL("failed to alloc map", map); | |
22 | ||
23 | thread_map__read_comms(map); | |
24 | ||
25 | TEST_ASSERT_VAL("wrong nr", map->nr == 1); | |
26 | TEST_ASSERT_VAL("wrong pid", | |
27 | thread_map__pid(map, 0) == getpid()); | |
28 | TEST_ASSERT_VAL("wrong comm", | |
29 | thread_map__comm(map, 0) && | |
8fbc38aa | 30 | !strcmp(thread_map__comm(map, 0), NAME)); |
35318d20 JO |
31 | TEST_ASSERT_VAL("wrong refcnt", |
32 | atomic_read(&map->refcnt) == 1); | |
134aa44f JO |
33 | thread_map__put(map); |
34 | ||
35 | /* test dummy pid */ | |
36 | map = thread_map__new_dummy(); | |
37 | TEST_ASSERT_VAL("failed to alloc map", map); | |
38 | ||
39 | thread_map__read_comms(map); | |
40 | ||
41 | TEST_ASSERT_VAL("wrong nr", map->nr == 1); | |
42 | TEST_ASSERT_VAL("wrong pid", thread_map__pid(map, 0) == -1); | |
43 | TEST_ASSERT_VAL("wrong comm", | |
44 | thread_map__comm(map, 0) && | |
45 | !strcmp(thread_map__comm(map, 0), "dummy")); | |
35318d20 JO |
46 | TEST_ASSERT_VAL("wrong refcnt", |
47 | atomic_read(&map->refcnt) == 1); | |
134aa44f JO |
48 | thread_map__put(map); |
49 | return 0; | |
50 | } | |
99471c96 JO |
51 | |
52 | static int process_event(struct perf_tool *tool __maybe_unused, | |
53 | union perf_event *event, | |
54 | struct perf_sample *sample __maybe_unused, | |
55 | struct machine *machine __maybe_unused) | |
56 | { | |
57 | struct thread_map_event *map = &event->thread_map; | |
59660942 | 58 | struct thread_map *threads; |
99471c96 JO |
59 | |
60 | TEST_ASSERT_VAL("wrong nr", map->nr == 1); | |
61 | TEST_ASSERT_VAL("wrong pid", map->entries[0].pid == (u64) getpid()); | |
8fbc38aa | 62 | TEST_ASSERT_VAL("wrong comm", !strcmp(map->entries[0].comm, NAME)); |
59660942 JO |
63 | |
64 | threads = thread_map__new_event(&event->thread_map); | |
65 | TEST_ASSERT_VAL("failed to alloc map", threads); | |
66 | ||
67 | TEST_ASSERT_VAL("wrong nr", threads->nr == 1); | |
68 | TEST_ASSERT_VAL("wrong pid", | |
69 | thread_map__pid(threads, 0) == getpid()); | |
70 | TEST_ASSERT_VAL("wrong comm", | |
71 | thread_map__comm(threads, 0) && | |
8fbc38aa | 72 | !strcmp(thread_map__comm(threads, 0), NAME)); |
59660942 JO |
73 | TEST_ASSERT_VAL("wrong refcnt", |
74 | atomic_read(&threads->refcnt) == 1); | |
75 | thread_map__put(threads); | |
99471c96 JO |
76 | return 0; |
77 | } | |
78 | ||
79 | int test__thread_map_synthesize(int subtest __maybe_unused) | |
80 | { | |
81 | struct thread_map *threads; | |
82 | ||
8fbc38aa JO |
83 | TEST_ASSERT_VAL("failed to set process name", |
84 | !prctl(PR_SET_NAME, NAMEUL, 0, 0, 0)); | |
85 | ||
99471c96 JO |
86 | /* test map on current pid */ |
87 | threads = thread_map__new_by_pid(getpid()); | |
88 | TEST_ASSERT_VAL("failed to alloc map", threads); | |
89 | ||
90 | thread_map__read_comms(threads); | |
91 | ||
92 | TEST_ASSERT_VAL("failed to synthesize map", | |
93 | !perf_event__synthesize_thread_map2(NULL, threads, process_event, NULL)); | |
94 | ||
95 | return 0; | |
96 | } | |
38af91f0 JO |
97 | |
98 | int test__thread_map_remove(int subtest __maybe_unused) | |
99 | { | |
100 | struct thread_map *threads; | |
101 | char *str; | |
102 | int i; | |
103 | ||
104 | TEST_ASSERT_VAL("failed to allocate map string", | |
105 | asprintf(&str, "%d,%d", getpid(), getppid()) >= 0); | |
106 | ||
107 | threads = thread_map__new_str(str, NULL, 0); | |
108 | ||
109 | TEST_ASSERT_VAL("failed to allocate thread_map", | |
110 | threads); | |
111 | ||
112 | if (verbose) | |
113 | thread_map__fprintf(threads, stderr); | |
114 | ||
115 | TEST_ASSERT_VAL("failed to remove thread", | |
116 | !thread_map__remove(threads, 0)); | |
117 | ||
118 | TEST_ASSERT_VAL("thread_map count != 1", threads->nr == 1); | |
119 | ||
120 | if (verbose) | |
121 | thread_map__fprintf(threads, stderr); | |
122 | ||
123 | TEST_ASSERT_VAL("failed to remove thread", | |
124 | !thread_map__remove(threads, 0)); | |
125 | ||
126 | TEST_ASSERT_VAL("thread_map count != 0", threads->nr == 0); | |
127 | ||
128 | if (verbose) | |
129 | thread_map__fprintf(threads, stderr); | |
130 | ||
131 | TEST_ASSERT_VAL("failed to not remove thread", | |
132 | thread_map__remove(threads, 0)); | |
133 | ||
134 | for (i = 0; i < threads->nr; i++) | |
135 | free(threads->map[i].comm); | |
136 | ||
137 | free(threads); | |
138 | return 0; | |
139 | } |