1 /**
2 * Copyright (c) 2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "runtime/tests/pygote_space_allocator_test_base.h"
17
18 namespace ark::mem {
19
InitAllocTest()20 void PygoteSpaceAllocatorTest::InitAllocTest()
21 {
22 [[maybe_unused]] auto pygoteSpaceAllocator = GetPygoteSpaceAllocator();
23 auto cls = GetObjectClass();
24
25 auto nonMovableHeader = ark::ObjectHeader::CreateNonMovable(cls);
26 ASSERT_NE(nonMovableHeader, nullptr);
27 ASSERT_TRUE(pygoteSpaceAllocator->ContainObject(static_cast<ObjectHeader *>(nonMovableHeader)));
28 ASSERT_TRUE(pygoteSpaceAllocator->IsLive(static_cast<ObjectHeader *>(nonMovableHeader)));
29
30 auto movableHeader = ark::ObjectHeader::Create(cls);
31 ASSERT_NE(nonMovableHeader, nullptr);
32 ASSERT_FALSE(pygoteSpaceAllocator->ContainObject(static_cast<ObjectHeader *>(movableHeader)));
33
34 pygoteSpaceAllocator->Free(nonMovableHeader);
35 ASSERT_TRUE(pygoteSpaceAllocator->ContainObject(static_cast<ObjectHeader *>(nonMovableHeader)));
36 ASSERT_FALSE(pygoteSpaceAllocator->IsLive(static_cast<ObjectHeader *>(nonMovableHeader)));
37 }
38
ForkedAllocTest()39 void PygoteSpaceAllocatorTest::ForkedAllocTest()
40 {
41 [[maybe_unused]] auto pygoteSpaceAllocator = GetPygoteSpaceAllocator();
42 auto cls = GetObjectClass();
43
44 PygoteFork();
45
46 auto nonMovableHeader = ark::ObjectHeader::CreateNonMovable(cls);
47 ASSERT_NE(nonMovableHeader, nullptr);
48 ASSERT_FALSE(pygoteSpaceAllocator->ContainObject(static_cast<ObjectHeader *>(nonMovableHeader)));
49
50 auto movableHeader = ark::ObjectHeader::Create(cls);
51 ASSERT_NE(movableHeader, nullptr);
52 ASSERT_FALSE(pygoteSpaceAllocator->ContainObject(static_cast<ObjectHeader *>(movableHeader)));
53 }
54
NonMovableLiveObjectAllocTest()55 void PygoteSpaceAllocatorTest::NonMovableLiveObjectAllocTest()
56 {
57 [[maybe_unused]] auto pygoteSpaceAllocator = GetPygoteSpaceAllocator();
58 auto cls = GetObjectClass();
59 auto globalObjectStorage = thread_->GetVM()->GetGlobalObjectStorage();
60
61 auto nonMovableHeader = ark::ObjectHeader::CreateNonMovable(cls);
62 ASSERT_NE(nonMovableHeader, nullptr);
63 ASSERT_TRUE(pygoteSpaceAllocator->ContainObject(static_cast<ObjectHeader *>(nonMovableHeader)));
64 ASSERT_TRUE(pygoteSpaceAllocator->IsLive(static_cast<ObjectHeader *>(nonMovableHeader)));
65 [[maybe_unused]] auto *ref = globalObjectStorage->Add(nonMovableHeader, ark::mem::Reference::ObjectType::GLOBAL);
66
67 PygoteFork();
68
69 ASSERT_TRUE(pygoteSpaceAllocator->ContainObject(static_cast<ObjectHeader *>(nonMovableHeader)));
70 ASSERT_TRUE(pygoteSpaceAllocator->IsLive(static_cast<ObjectHeader *>(nonMovableHeader)));
71
72 TriggerGc();
73
74 ASSERT_TRUE(pygoteSpaceAllocator->ContainObject(static_cast<ObjectHeader *>(nonMovableHeader)));
75 ASSERT_TRUE(pygoteSpaceAllocator->IsLive(static_cast<ObjectHeader *>(nonMovableHeader)));
76
77 pygoteSpaceAllocator->Free(nonMovableHeader);
78 ASSERT_TRUE(pygoteSpaceAllocator->ContainObject(static_cast<ObjectHeader *>(nonMovableHeader)));
79 ASSERT_FALSE(pygoteSpaceAllocator->IsLive(static_cast<ObjectHeader *>(nonMovableHeader)));
80 }
81
NonMovableUnliveObjectAllocTest()82 void PygoteSpaceAllocatorTest::NonMovableUnliveObjectAllocTest()
83 {
84 [[maybe_unused]] auto pygoteSpaceAllocator = GetPygoteSpaceAllocator();
85 auto cls = GetObjectClass();
86 auto globalObjectStorage = thread_->GetVM()->GetGlobalObjectStorage();
87
88 auto nonMovableHeader = ark::ObjectHeader::CreateNonMovable(cls);
89 ASSERT_NE(nonMovableHeader, nullptr);
90 ASSERT_TRUE(pygoteSpaceAllocator->ContainObject(static_cast<ObjectHeader *>(nonMovableHeader)));
91 ASSERT_TRUE(pygoteSpaceAllocator->IsLive(static_cast<ObjectHeader *>(nonMovableHeader)));
92 [[maybe_unused]] auto *ref = globalObjectStorage->Add(nonMovableHeader, ark::mem::Reference::ObjectType::GLOBAL);
93
94 PygoteFork();
95
96 ASSERT_TRUE(pygoteSpaceAllocator->ContainObject(static_cast<ObjectHeader *>(nonMovableHeader)));
97 ASSERT_TRUE(pygoteSpaceAllocator->IsLive(static_cast<ObjectHeader *>(nonMovableHeader)));
98 globalObjectStorage->Remove(ref);
99
100 TriggerGc();
101
102 ASSERT_TRUE(pygoteSpaceAllocator->ContainObject(static_cast<ObjectHeader *>(nonMovableHeader)));
103 ASSERT_FALSE(pygoteSpaceAllocator->IsLive(static_cast<ObjectHeader *>(nonMovableHeader)));
104 }
105
MovableLiveObjectAllocTest()106 void PygoteSpaceAllocatorTest::MovableLiveObjectAllocTest()
107 {
108 [[maybe_unused]] auto pygoteSpaceAllocator = GetPygoteSpaceAllocator();
109 auto cls = GetObjectClass();
110 auto globalObjectStorage = thread_->GetVM()->GetGlobalObjectStorage();
111
112 auto movableHeader = ark::ObjectHeader::Create(cls);
113 ASSERT_NE(movableHeader, nullptr);
114 ASSERT_FALSE(pygoteSpaceAllocator->ContainObject(static_cast<ObjectHeader *>(movableHeader)));
115 [[maybe_unused]] auto *ref = globalObjectStorage->Add(movableHeader, ark::mem::Reference::ObjectType::GLOBAL);
116
117 PygoteFork();
118
119 auto obj = globalObjectStorage->Get(ref);
120 ASSERT_TRUE(pygoteSpaceAllocator->ContainObject(static_cast<ObjectHeader *>(obj)));
121 ASSERT_TRUE(pygoteSpaceAllocator->IsLive(static_cast<ObjectHeader *>(obj)));
122
123 TriggerGc();
124
125 ASSERT_TRUE(pygoteSpaceAllocator->ContainObject(static_cast<ObjectHeader *>(obj)));
126 ASSERT_TRUE(pygoteSpaceAllocator->IsLive(static_cast<ObjectHeader *>(obj)));
127 }
128
MovableUnliveObjectAllocTest()129 void PygoteSpaceAllocatorTest::MovableUnliveObjectAllocTest()
130 {
131 [[maybe_unused]] auto pygoteSpaceAllocator = GetPygoteSpaceAllocator();
132 auto cls = GetObjectClass();
133 auto globalObjectStorage = thread_->GetVM()->GetGlobalObjectStorage();
134
135 auto movableHeader = ark::ObjectHeader::Create(cls);
136 ASSERT_NE(movableHeader, nullptr);
137 ASSERT_FALSE(pygoteSpaceAllocator->ContainObject(static_cast<ObjectHeader *>(movableHeader)));
138 [[maybe_unused]] auto *ref = globalObjectStorage->Add(movableHeader, ark::mem::Reference::ObjectType::GLOBAL);
139
140 PygoteFork();
141
142 auto obj = globalObjectStorage->Get(ref);
143 ASSERT_TRUE(pygoteSpaceAllocator->ContainObject(static_cast<ObjectHeader *>(obj)));
144 ASSERT_TRUE(pygoteSpaceAllocator->IsLive(static_cast<ObjectHeader *>(obj)));
145 globalObjectStorage->Remove(ref);
146
147 TriggerGc();
148
149 ASSERT_TRUE(pygoteSpaceAllocator->ContainObject(static_cast<ObjectHeader *>(obj)));
150 ASSERT_FALSE(pygoteSpaceAllocator->IsLive(static_cast<ObjectHeader *>(obj)));
151 }
152
MuchObjectAllocTest()153 void PygoteSpaceAllocatorTest::MuchObjectAllocTest()
154 {
155 [[maybe_unused]] auto pygoteSpaceAllocator = GetPygoteSpaceAllocator();
156 auto cls = GetObjectClass();
157 auto globalObjectStorage = thread_->GetVM()->GetGlobalObjectStorage();
158
159 static constexpr size_t OBJ_NUM = 1024;
160
161 PandaVector<Reference *> movableRefs;
162 PandaVector<Reference *> nonMovableRefs;
163 for (size_t i = 0; i < OBJ_NUM; i++) {
164 auto movable = ark::ObjectHeader::Create(cls);
165 movableRefs.push_back(globalObjectStorage->Add(movable, ark::mem::Reference::ObjectType::GLOBAL));
166 auto nonMovable = ark::ObjectHeader::CreateNonMovable(cls);
167 nonMovableRefs.push_back(globalObjectStorage->Add(nonMovable, ark::mem::Reference::ObjectType::GLOBAL));
168 }
169
170 PygoteFork();
171
172 PandaVector<ObjectHeader *> movableObjs;
173 PandaVector<ObjectHeader *> nonMovableObjs;
174 for (auto movalbeRef : movableRefs) {
175 auto obj = globalObjectStorage->Get(movalbeRef);
176 ASSERT_TRUE(pygoteSpaceAllocator->ContainObject(static_cast<ObjectHeader *>(obj)));
177 ASSERT_TRUE(pygoteSpaceAllocator->IsLive(static_cast<ObjectHeader *>(obj)));
178 globalObjectStorage->Remove(movalbeRef);
179 movableObjs.push_back(obj);
180 }
181
182 for (auto nonMovalbeRef : nonMovableRefs) {
183 auto obj = globalObjectStorage->Get(nonMovalbeRef);
184 ASSERT_TRUE(pygoteSpaceAllocator->ContainObject(static_cast<ObjectHeader *>(obj)));
185 ASSERT_TRUE(pygoteSpaceAllocator->IsLive(static_cast<ObjectHeader *>(obj)));
186 globalObjectStorage->Remove(nonMovalbeRef);
187 nonMovableObjs.push_back(obj);
188 }
189
190 TriggerGc();
191
192 for (auto movalbeObj : movableObjs) {
193 ASSERT_TRUE(pygoteSpaceAllocator->ContainObject(static_cast<ObjectHeader *>(movalbeObj)));
194 ASSERT_FALSE(pygoteSpaceAllocator->IsLive(static_cast<ObjectHeader *>(movalbeObj)));
195 }
196
197 for (auto nonMovalbeObj : nonMovableObjs) {
198 ASSERT_TRUE(pygoteSpaceAllocator->ContainObject(static_cast<ObjectHeader *>(nonMovalbeObj)));
199 ASSERT_FALSE(pygoteSpaceAllocator->IsLive(static_cast<ObjectHeader *>(nonMovalbeObj)));
200 }
201 }
202 } // namespace ark::mem
203