]>
Commit | Line | Data |
---|---|---|
b2441318 | 1 | // SPDX-License-Identifier: GPL-2.0 |
fabf0123 JO |
2 | #include "tests.h" |
3 | #include "machine.h" | |
4 | #include "thread.h" | |
5 | #include "map.h" | |
84f5d36f | 6 | #include "debug.h" |
fabf0123 | 7 | |
81f17c90 | 8 | int test__thread_mg_share(struct test *test __maybe_unused, int subtest __maybe_unused) |
fabf0123 JO |
9 | { |
10 | struct machines machines; | |
11 | struct machine *machine; | |
12 | ||
13 | /* thread group */ | |
14 | struct thread *leader; | |
15 | struct thread *t1, *t2, *t3; | |
16 | struct map_groups *mg; | |
17 | ||
18 | /* other process */ | |
19 | struct thread *other, *other_leader; | |
20 | struct map_groups *other_mg; | |
21 | ||
22 | /* | |
23 | * This test create 2 processes abstractions (struct thread) | |
24 | * with several threads and checks they properly share and | |
25 | * maintain map groups info (struct map_groups). | |
26 | * | |
27 | * thread group (pid: 0, tids: 0, 1, 2, 3) | |
28 | * other group (pid: 4, tids: 4, 5) | |
29 | */ | |
30 | ||
31 | machines__init(&machines); | |
32 | machine = &machines.host; | |
33 | ||
34 | /* create process with 4 threads */ | |
35 | leader = machine__findnew_thread(machine, 0, 0); | |
36 | t1 = machine__findnew_thread(machine, 0, 1); | |
37 | t2 = machine__findnew_thread(machine, 0, 2); | |
38 | t3 = machine__findnew_thread(machine, 0, 3); | |
39 | ||
40 | /* and create 1 separated process, without thread leader */ | |
41 | other = machine__findnew_thread(machine, 4, 5); | |
42 | ||
43 | TEST_ASSERT_VAL("failed to create threads", | |
44 | leader && t1 && t2 && t3 && other); | |
45 | ||
46 | mg = leader->mg; | |
ead05e8f | 47 | TEST_ASSERT_EQUAL("wrong refcnt", refcount_read(&mg->refcnt), 4); |
fabf0123 JO |
48 | |
49 | /* test the map groups pointer is shared */ | |
50 | TEST_ASSERT_VAL("map groups don't match", mg == t1->mg); | |
51 | TEST_ASSERT_VAL("map groups don't match", mg == t2->mg); | |
52 | TEST_ASSERT_VAL("map groups don't match", mg == t3->mg); | |
53 | ||
54 | /* | |
55 | * Verify the other leader was created by previous call. | |
56 | * It should have shared map groups with no change in | |
57 | * refcnt. | |
58 | */ | |
59 | other_leader = machine__find_thread(machine, 4, 4); | |
60 | TEST_ASSERT_VAL("failed to find other leader", other_leader); | |
61 | ||
8b00f469 ACM |
62 | /* |
63 | * Ok, now that all the rbtree related operations were done, | |
64 | * lets remove all of them from there so that we can do the | |
65 | * refcounting tests. | |
66 | */ | |
67 | machine__remove_thread(machine, leader); | |
68 | machine__remove_thread(machine, t1); | |
69 | machine__remove_thread(machine, t2); | |
70 | machine__remove_thread(machine, t3); | |
71 | machine__remove_thread(machine, other); | |
72 | machine__remove_thread(machine, other_leader); | |
73 | ||
fabf0123 | 74 | other_mg = other->mg; |
ead05e8f | 75 | TEST_ASSERT_EQUAL("wrong refcnt", refcount_read(&other_mg->refcnt), 2); |
fabf0123 JO |
76 | |
77 | TEST_ASSERT_VAL("map groups don't match", other_mg == other_leader->mg); | |
78 | ||
79 | /* release thread group */ | |
b91fc39f | 80 | thread__put(leader); |
ead05e8f | 81 | TEST_ASSERT_EQUAL("wrong refcnt", refcount_read(&mg->refcnt), 3); |
fabf0123 | 82 | |
b91fc39f | 83 | thread__put(t1); |
ead05e8f | 84 | TEST_ASSERT_EQUAL("wrong refcnt", refcount_read(&mg->refcnt), 2); |
fabf0123 | 85 | |
b91fc39f | 86 | thread__put(t2); |
ead05e8f | 87 | TEST_ASSERT_EQUAL("wrong refcnt", refcount_read(&mg->refcnt), 1); |
fabf0123 | 88 | |
b91fc39f | 89 | thread__put(t3); |
fabf0123 JO |
90 | |
91 | /* release other group */ | |
b91fc39f | 92 | thread__put(other_leader); |
ead05e8f | 93 | TEST_ASSERT_EQUAL("wrong refcnt", refcount_read(&other_mg->refcnt), 1); |
fabf0123 | 94 | |
b91fc39f | 95 | thread__put(other); |
fabf0123 | 96 | |
fabf0123 JO |
97 | machines__exit(&machines); |
98 | return 0; | |
99 | } |