From b43e92e7c4ec3279a25335d269dd75c5ed7b4651 Mon Sep 17 00:00:00 2001 From: dingwen Date: Fri, 15 Jul 2022 15:17:33 +0800 Subject: [PATCH] Fix miss weak References records in huge object bug Description:miss weak References records in huge object issue:https://gitee.com/openharmony/ark_js_runtime/issues/I5HALR Signed-off-by: dingwen --- ecmascript/mem/parallel_marker-inl.h | 27 +++++++++++++++------------ ecmascript/mem/parallel_marker.cpp | 7 ++++--- ecmascript/mem/parallel_marker.h | 9 +++++---- 3 files changed, 24 insertions(+), 19 deletions(-) diff --git a/ecmascript/mem/parallel_marker-inl.h b/ecmascript/mem/parallel_marker-inl.h index 2d1c67f4..2df4656c 100644 --- a/ecmascript/mem/parallel_marker-inl.h +++ b/ecmascript/mem/parallel_marker-inl.h @@ -55,7 +55,8 @@ inline void NonMovableMarker::HandleRangeRoots(uint32_t threadId, [[maybe_unused JSTaggedValue value(slot.GetTaggedType()); if (value.IsHeapObject()) { if (value.IsWeakForHeapObject()) { - RecordWeakReference(threadId, reinterpret_cast(slot.SlotAddress())); + Region *objectRegion = Region::ObjectAddressToRange(start.SlotAddress()); + RecordWeakReference(threadId, reinterpret_cast(slot.SlotAddress()), objectRegion); continue; } MarkObject(threadId, value.GetTaggedObject()); @@ -65,12 +66,12 @@ inline void NonMovableMarker::HandleRangeRoots(uint32_t threadId, [[maybe_unused inline void NonMovableMarker::HandleOldToNewRSet(uint32_t threadId, Region *region) { - region->IterateAllOldToNewBits([this, threadId](void *mem) -> bool { + region->IterateAllOldToNewBits([this, threadId, ®ion](void *mem) -> bool { ObjectSlot slot(ToUintPtr(mem)); JSTaggedValue value(slot.GetTaggedType()); if (value.IsHeapObject()) { if (value.IsWeakForHeapObject()) { - RecordWeakReference(threadId, reinterpret_cast(mem)); + RecordWeakReference(threadId, reinterpret_cast(mem), region); } else { MarkObject(threadId, value.GetTaggedObject()); } @@ -79,11 +80,10 @@ inline void NonMovableMarker::HandleOldToNewRSet(uint32_t threadId, Region *regi }); } -inline void NonMovableMarker::RecordWeakReference(uint32_t threadId, JSTaggedType *ref) +inline void NonMovableMarker::RecordWeakReference(uint32_t threadId, JSTaggedType *ref, Region *objectRegion) { auto value = JSTaggedValue(*ref); Region *valueRegion = Region::ObjectAddressToRange(value.GetTaggedWeakRef()); - Region *objectRegion = Region::ObjectAddressToRange(reinterpret_cast(ref)); if (!objectRegion->InYoungSpaceOrCSet() && !valueRegion->InYoungSpaceOrCSet()) { workManager_->PushWeakReference(threadId, ref); } @@ -104,7 +104,8 @@ inline void MovableMarker::HandleRangeRoots(uint32_t threadId, [[maybe_unused]] JSTaggedValue value(slot.GetTaggedType()); if (value.IsHeapObject()) { if (value.IsWeakForHeapObject()) { - RecordWeakReference(threadId, reinterpret_cast(slot.SlotAddress())); + Region *objectRegion = Region::ObjectAddressToRange(start.SlotAddress()); + RecordWeakReference(threadId, reinterpret_cast(slot.SlotAddress()), objectRegion); } else { MarkObject(threadId, value.GetTaggedObject(), slot); } @@ -114,12 +115,12 @@ inline void MovableMarker::HandleRangeRoots(uint32_t threadId, [[maybe_unused]] inline void MovableMarker::HandleOldToNewRSet(uint32_t threadId, Region *region) { - region->IterateAllOldToNewBits([this, threadId](void *mem) -> bool { + region->IterateAllOldToNewBits([this, threadId, ®ion](void *mem) -> bool { ObjectSlot slot(ToUintPtr(mem)); JSTaggedValue value(slot.GetTaggedType()); if (value.IsHeapObject()) { if (value.IsWeakForHeapObject()) { - RecordWeakReference(threadId, reinterpret_cast(mem)); + RecordWeakReference(threadId, reinterpret_cast(mem), region); return true; } auto slotStatus = MarkObject(threadId, value.GetTaggedObject(), slot); @@ -226,11 +227,12 @@ inline bool SemiGCMarker::ShouldBePromoted(TaggedObject *object) return (region->BelowAgeMark() || (region->HasAgeMark() && ToUintPtr(object) < waterLine_)); } -inline void SemiGCMarker::RecordWeakReference(uint32_t threadId, JSTaggedType *ref) +inline void SemiGCMarker::RecordWeakReference(uint32_t threadId, JSTaggedType *ref, + [[maybe_unused]] Region *objectRegion) { auto value = JSTaggedValue(*ref); - Region *objectRegion = Region::ObjectAddressToRange(value.GetTaggedWeakRef()); - if (objectRegion->InYoungSpace()) { + Region *valueRegion = Region::ObjectAddressToRange(value.GetTaggedWeakRef()); + if (valueRegion->InYoungSpace()) { workManager_->PushWeakReference(threadId, ref); } } @@ -273,7 +275,8 @@ inline SlotStatus CompressGCMarker::EvacuateObject(uint32_t threadId, TaggedObje return SlotStatus::CLEAR_SLOT; } -inline void CompressGCMarker::RecordWeakReference(uint32_t threadId, JSTaggedType *ref) +inline void CompressGCMarker::RecordWeakReference(uint32_t threadId, JSTaggedType *ref, + [[maybe_unused]] Region *objectRegion) { workManager_->PushWeakReference(threadId, ref); } diff --git a/ecmascript/mem/parallel_marker.cpp b/ecmascript/mem/parallel_marker.cpp index 45df3331..476a418f 100644 --- a/ecmascript/mem/parallel_marker.cpp +++ b/ecmascript/mem/parallel_marker.cpp @@ -62,7 +62,7 @@ void NonMovableMarker::ProcessMarkStack(uint32_t threadId) obj = value.GetTaggedObject(); MarkObject(threadId, obj); } else { - RecordWeakReference(threadId, reinterpret_cast(slot.SlotAddress())); + RecordWeakReference(threadId, reinterpret_cast(slot.SlotAddress()), rootRegion); obj = value.GetWeakReferentUnChecked(); } if (needBarrier) { @@ -99,11 +99,11 @@ void SemiGCMarker::ProcessMarkStack(uint32_t threadId) for (ObjectSlot slot = start; slot < end; slot++) { JSTaggedValue value(slot.GetTaggedType()); if (value.IsHeapObject()) { + Region *rootRegion = Region::ObjectAddressToRange(root); if (value.IsWeakForHeapObject()) { - RecordWeakReference(threadId, reinterpret_cast(slot.SlotAddress())); + RecordWeakReference(threadId, reinterpret_cast(slot.SlotAddress()), rootRegion); continue; } - Region *rootRegion = Region::ObjectAddressToRange(root); auto slotStatus = MarkObject(threadId, value.GetTaggedObject(), slot); if (!rootRegion->InYoungSpace() && slotStatus == SlotStatus::KEEP_SLOT) { SlotNeedUpdate waitUpdate(reinterpret_cast(root), slot); @@ -132,6 +132,7 @@ void CompressGCMarker::ProcessMarkStack(uint32_t threadId) JSTaggedValue value(slot.GetTaggedType()); if (value.IsHeapObject()) { if (value.IsWeakForHeapObject()) { + // It is unnecessary to use region pointer in compressGCMarker. RecordWeakReference(threadId, reinterpret_cast(slot.SlotAddress())); continue; } diff --git a/ecmascript/mem/parallel_marker.h b/ecmascript/mem/parallel_marker.h index 0a54e793..8b1b82f6 100644 --- a/ecmascript/mem/parallel_marker.h +++ b/ecmascript/mem/parallel_marker.h @@ -68,7 +68,8 @@ protected: virtual inline void HandleRoots(uint32_t threadId, [[maybe_unused]] Root type, ObjectSlot slot) = 0; virtual inline void HandleRangeRoots(uint32_t threadId, [[maybe_unused]] Root type, ObjectSlot start, ObjectSlot end) = 0; - virtual inline void RecordWeakReference([[maybe_unused]] uint32_t threadId, [[maybe_unused]] JSTaggedType *ref) + virtual inline void RecordWeakReference([[maybe_unused]] uint32_t threadId, [[maybe_unused]] JSTaggedType *ref, + [[maybe_unused]] Region *objectRegion) { LOG(FATAL, ECMASCRIPT) << "can not call this method"; } @@ -90,7 +91,7 @@ protected: ObjectSlot end) override; inline void HandleOldToNewRSet(uint32_t threadId, Region *region) override; - inline void RecordWeakReference(uint32_t threadId, JSTaggedType *ref) override; + inline void RecordWeakReference(uint32_t threadId, JSTaggedType *ref, Region *objectRegion) override; }; class MovableMarker : public Marker { @@ -124,7 +125,7 @@ protected: inline SlotStatus MarkObject(uint32_t threadId, TaggedObject *object, ObjectSlot slot) override; inline SlotStatus EvacuateObject(uint32_t threadId, TaggedObject *object, const MarkWord &markWord, ObjectSlot slot) override; - inline void RecordWeakReference(uint32_t threadId, JSTaggedType *ref) override; + inline void RecordWeakReference(uint32_t threadId, JSTaggedType *ref, Region *objectRegion = nullptr) override; private: inline bool ShouldBePromoted(TaggedObject *object); @@ -142,7 +143,7 @@ protected: inline SlotStatus EvacuateObject(uint32_t threadId, TaggedObject *object, const MarkWord &markWord, ObjectSlot slot) override; - inline void RecordWeakReference(uint32_t threadId, JSTaggedType *ref) override; + inline void RecordWeakReference(uint32_t threadId, JSTaggedType *ref, Region *objectRegion = nullptr) override; }; } // namespace panda::ecmascript #endif // ECMASCRIPT_MEM_PARALLEL_MARKER_H -- Gitee