diff --git a/runtime/mem/ecma_reference_processor.cpp b/runtime/mem/ecma_reference_processor.cpp index 8762f45d4dd945ac3dc9f193dc7cacc019d7dd6b..9332406fbf5a230483803f5af198470cef986454 100644 --- a/runtime/mem/ecma_reference_processor.cpp +++ b/runtime/mem/ecma_reference_processor.cpp @@ -109,6 +109,7 @@ void EcmaReferenceProcessor::HandleReference([[maybe_unused]] GC *gc, [[maybe_un [[maybe_unused]] const BaseClass *base_class, const ObjectHeader *object, [[maybe_unused]] const ReferenceProcessPredicateT &pred) { + os::memory::LockHolder lock(weak_ref_lock_); dyn_weak_references_.insert(const_cast(object)); } @@ -117,6 +118,7 @@ void EcmaReferenceProcessor::ProcessReferences([[maybe_unused]] bool concurrent, [[maybe_unused]] GCPhase gc_phase, [[maybe_unused]] const mem::GC::ReferenceClearPredicateT &pred) { + os::memory::LockHolder lock(weak_ref_lock_); panda::ecmascript::JSThread *thread = vm_->GetAssociatedJSThread(); while (!dyn_weak_references_.empty()) { ObjectHeader *reference = *dyn_weak_references_.begin(); diff --git a/runtime/mem/ecma_reference_processor.h b/runtime/mem/ecma_reference_processor.h index ccda217374df2cd1ad4e57a77dc57d55e59f8c80..87210af03cc6ae996a9d6ceb20d9633b5126a529 100644 --- a/runtime/mem/ecma_reference_processor.h +++ b/runtime/mem/ecma_reference_processor.h @@ -66,11 +66,13 @@ public: size_t GetReferenceQueueSize() const override { + os::memory::LockHolder lock(weak_ref_lock_); return dyn_weak_references_.size(); } private: - PandaUnorderedSet dyn_weak_references_; + mutable os::memory::Mutex weak_ref_lock_; + PandaUnorderedSet dyn_weak_references_ GUARDED_BY(weak_ref_lock_); panda::ecmascript::EcmaVM *vm_; GC *gc_; };