From 6281ba1ac30eba4b42a0c6a664ea7340f3450f79 Mon Sep 17 00:00:00 2001 From: Artem Udovichenko Date: Tue, 13 Sep 2022 16:46:31 +0300 Subject: [PATCH] Guard access to EcmaReferenceProcessor::dyn_weak_references_ by a mutex Several threads may access to the variable at the same time. For example GC workers do this while marking weak references. Change-Id: If3a51e7ea6511facc88637b88d78400f1b66aeee Signed-off-by: Artem Udovichenko --- runtime/mem/ecma_reference_processor.cpp | 2 ++ runtime/mem/ecma_reference_processor.h | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/runtime/mem/ecma_reference_processor.cpp b/runtime/mem/ecma_reference_processor.cpp index 8762f45d4..9332406fb 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 ccda21737..87210af03 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_; }; -- Gitee