Fix serialize shared object with clone list bug

Description: Fix serialize shared object with clone list bug
Issue: https://gitee.com/openharmony/arkcompiler_ets_runtime/issues/IARMXG?from=project-issue
Signed-off-by: dingwen <dingwen6@huawei.com>
Change-Id: I65362110c9e6233bea41bf90c61754363efaa949
This commit is contained in:
dingwen 2024-09-17 14:42:45 +08:00
parent 089fe0d204
commit 6854ae9d97
3 changed files with 46 additions and 7 deletions

View File

@ -603,7 +603,7 @@ void BaseDeserializer::AllocateMultiRegion(SparseSpace *space, size_t spaceObjSi
space->ResetTopPointer(space->GetCurrentRegion()->GetEnd() - lastRegionRemainSize);
}
Region *BaseDeserializer::AllocateMultiSharedRegion(SharedSparseSpace *space, size_t spaceObjSize, size_t &regionIndex)
void BaseDeserializer::AllocateMultiSharedRegion(SharedSparseSpace *space, size_t spaceObjSize, size_t &regionIndex)
{
regionIndex = regionVector_.size();
size_t regionAlignedSize = SerializeData::AlignUpRegionAvailableSize(spaceObjSize);
@ -628,7 +628,6 @@ Region *BaseDeserializer::AllocateMultiSharedRegion(SharedSparseSpace *space, si
regionNum--;
}
space->MergeDeserializeAllocateRegions(allocateRegions);
return allocateRegions.front();
}
void BaseDeserializer::AllocateToOldSpace(size_t oldSpaceSize)
@ -687,8 +686,8 @@ void BaseDeserializer::AllocateToSharedOldSpace(size_t sOldSpaceSize)
SharedSparseSpace *space = sheap_->GetOldSpace();
uintptr_t object = space->AllocateNoGCAndExpand(thread_, sOldSpaceSize);
if (UNLIKELY(object == 0U)) {
Region *region = AllocateMultiSharedRegion(space, sOldSpaceSize, sOldRegionIndex_);
sOldSpaceBeginAddr_ = region->GetBegin();
AllocateMultiSharedRegion(space, sOldSpaceSize, sOldRegionIndex_);
sOldSpaceBeginAddr_ = regionVector_[sOldRegionIndex_++]->GetBegin();
} else {
if (thread_->IsSharedConcurrentMarkingOrFinished()) {
Region *region = Region::ObjectAddressToRange(object);
@ -704,8 +703,8 @@ void BaseDeserializer::AllocateToSharedNonMovableSpace(size_t sNonMovableSpaceSi
SharedNonMovableSpace *space = sheap_->GetNonMovableSpace();
uintptr_t object = space->AllocateNoGCAndExpand(thread_, sNonMovableSpaceSize);
if (UNLIKELY(object == 0U)) {
Region *region = AllocateMultiSharedRegion(space, sNonMovableSpaceSize, sNonMovableRegionIndex_);
sNonMovableSpaceBeginAddr_ = region->GetBegin();
AllocateMultiSharedRegion(space, sNonMovableSpaceSize, sNonMovableRegionIndex_);
sNonMovableSpaceBeginAddr_ = regionVector_[sNonMovableRegionIndex_++]->GetBegin();
} else {
if (thread_->IsSharedConcurrentMarkingOrFinished()) {
Region *region = Region::ObjectAddressToRange(object);

View File

@ -108,7 +108,7 @@ private:
void AllocateToDifferentSpaces();
void AllocateMultiRegion(SparseSpace *space, size_t spaceObjSize, size_t &regionIndex);
Region *AllocateMultiSharedRegion(SharedSparseSpace *space, size_t spaceObjSize, size_t &regionIndex);
void AllocateMultiSharedRegion(SharedSparseSpace *space, size_t spaceObjSize, size_t &regionIndex);
void AllocateToOldSpace(size_t oldSpaceSize);
void AllocateToNonMovableSpace(size_t nonMovableSpaceSize);
void AllocateToMachineCodeSpace(size_t machineCodeSpaceSize);

View File

@ -569,6 +569,23 @@ public:
Destroy();
}
void SerializeMultiSharedRegionTest(SerializeData *data)
{
Init();
BaseDeserializer deserializer(thread, data);
JSHandle<JSTaggedValue> res = deserializer.ReadValue();
EXPECT_TRUE(!res.IsEmpty());
EXPECT_TRUE(res->IsJSObject());
JSTaggedValue elements = JSHandle<JSObject>(res)->GetElements();
EXPECT_TRUE(elements.IsTaggedArray());
EXPECT_EQ(JSHandle<TaggedArray>(thread, elements)->GetLength(), 10 * 1024); // 10 * 1024: array length
JSTaggedValue value = JSHandle<TaggedArray>(thread, elements)->Get(0);
EXPECT_TRUE(value.IsTaggedArray());
uint32_t length = JSHandle<TaggedArray>(thread, value)->GetLength();
EXPECT_EQ(length, 11 * 1024); // 11 * 1024: array length
Destroy();
}
void JSSharedSetBasicTest1(SerializeData *data)
{
Init();
@ -2468,4 +2485,27 @@ HWTEST_F_L0(JSSerializerTest, SerializeJSSharedMapBasic)
}
delete serializer;
};
HWTEST_F_L0(JSSerializerTest, SerializeMultiSharedRegion)
{
ObjectFactory *factory = ecmaVm->GetFactory();
JSHandle<TaggedArray> array = factory->NewSTaggedArray(10 * 1024, JSTaggedValue::Hole()); // 10 * 1024: array length
for (int i = 0; i < 5; i++) {
JSHandle<TaggedArray> element = factory->NewSTaggedArray((11 + i) * 1024, JSTaggedValue::Hole());
array->Set(thread, i, element);
}
JSHandle<JSObject> sobj = CreateEmptySObject(thread);
sobj->SetElements(thread, array);
ValueSerializer *serializer = new ValueSerializer(thread, false, true);
bool success = serializer->WriteValue(thread, JSHandle<JSTaggedValue>(sobj),
JSHandle<JSTaggedValue>(thread, JSTaggedValue::Undefined()),
JSHandle<JSTaggedValue>(thread, JSTaggedValue::Undefined()));
EXPECT_TRUE(success);
std::unique_ptr<SerializeData> data = serializer->Release();
JSDeserializerTest jsDeserializerTest;
std::thread t1(&JSDeserializerTest::SerializeMultiSharedRegionTest, jsDeserializerTest, data.release());
ThreadSuspensionScope scope(thread);
t1.join();
delete serializer;
};
} // namespace panda::test