Linux Perf
thread-mg-share.c
Go to the documentation of this file.
1 // SPDX-License-Identifier: GPL-2.0
2 #include "tests.h"
3 #include "machine.h"
4 #include "thread.h"
5 #include "map.h"
6 #include "debug.h"
7 
8 int test__thread_mg_share(struct test *test __maybe_unused, int subtest __maybe_unused)
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;
47  TEST_ASSERT_EQUAL("wrong refcnt", refcount_read(&mg->refcnt), 4);
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 
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 
74  other_mg = other->mg;
75  TEST_ASSERT_EQUAL("wrong refcnt", refcount_read(&other_mg->refcnt), 2);
76 
77  TEST_ASSERT_VAL("map groups don't match", other_mg == other_leader->mg);
78 
79  /* release thread group */
80  thread__put(leader);
81  TEST_ASSERT_EQUAL("wrong refcnt", refcount_read(&mg->refcnt), 3);
82 
83  thread__put(t1);
84  TEST_ASSERT_EQUAL("wrong refcnt", refcount_read(&mg->refcnt), 2);
85 
86  thread__put(t2);
87  TEST_ASSERT_EQUAL("wrong refcnt", refcount_read(&mg->refcnt), 1);
88 
89  thread__put(t3);
90 
91  /* release other group */
92  thread__put(other_leader);
93  TEST_ASSERT_EQUAL("wrong refcnt", refcount_read(&other_mg->refcnt), 1);
94 
95  thread__put(other);
96 
97  machines__exit(&machines);
98  return 0;
99 }
struct map_groups * mg
Definition: thread.h:23
void machines__exit(struct machines *machines)
Definition: machine.c:228
#define TEST_ASSERT_EQUAL(text, val, expected)
Definition: tests.h:15
struct machine host
Definition: machine.h:136
void machine__remove_thread(struct machine *machine, struct thread *th)
Definition: machine.c:1657
refcount_t refcnt
Definition: map.h:66
#define TEST_ASSERT_VAL(text, cond)
Definition: tests.h:7
struct thread * machine__find_thread(struct machine *machine, pid_t pid, pid_t tid)
Definition: machine.c:504
Definition: thread.h:18
Definition: map.h:63
void thread__put(struct thread *thread)
Definition: thread.c:119
void machines__init(struct machines *machines)
Definition: machine.c:222
Definition: tests.h:30
int test__thread_mg_share(struct test *test __maybe_unused, int subtest __maybe_unused)
struct thread * machine__findnew_thread(struct machine *machine, pid_t pid, pid_t tid)
Definition: machine.c:492