• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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