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