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; | |
46 | TEST_ASSERT_VAL("wrong refcnt", mg->refcnt == 4); | |
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 | ||
61 | other_mg = other->mg; | |
62 | TEST_ASSERT_VAL("wrong refcnt", other_mg->refcnt == 2); | |
63 | ||
64 | TEST_ASSERT_VAL("map groups don't match", other_mg == other_leader->mg); | |
65 | ||
66 | /* release thread group */ | |
67 | thread__delete(leader); | |
68 | TEST_ASSERT_VAL("wrong refcnt", mg->refcnt == 3); | |
69 | ||
70 | thread__delete(t1); | |
71 | TEST_ASSERT_VAL("wrong refcnt", mg->refcnt == 2); | |
72 | ||
73 | thread__delete(t2); | |
74 | TEST_ASSERT_VAL("wrong refcnt", mg->refcnt == 1); | |
75 | ||
76 | thread__delete(t3); | |
77 | ||
78 | /* release other group */ | |
79 | thread__delete(other_leader); | |
80 | TEST_ASSERT_VAL("wrong refcnt", other_mg->refcnt == 1); | |
81 | ||
82 | thread__delete(other); | |
83 | ||
84 | /* | |
85 | * Cannot call machine__delete_threads(machine) now, | |
86 | * because we've already released all the threads. | |
87 | */ | |
88 | ||
89 | machines__exit(&machines); | |
90 | return 0; | |
91 | } |