From a5a53efea976af505f4f849b5925d5e14c4f8e5c Mon Sep 17 00:00:00 2001 From: Mathieu Chartier Date: Fri, 12 Sep 2014 12:58:05 -0700 Subject: Add native support for FinalizerList.makeCircularListIfUnenqueued Called from FinalizerReference.enqueueSentinelReference to prevent a race where the GC updates pendingNext of the sentinel reference before enqueueSentinelReference. Bug: 17462553 (cherry picked from commit 3256166df40981f1f1997a5f00303712277c963f) Change-Id: I7ad2fd250c2715d1aeb919bd548ef9aab24f30a2 --- runtime/gc/reference_processor.cc | 45 +++++++++++++++++++++++++++++++++------ 1 file changed, 38 insertions(+), 7 deletions(-) (limited to 'runtime/gc/reference_processor.cc') diff --git a/runtime/gc/reference_processor.cc b/runtime/gc/reference_processor.cc index d3641d196f..75de623585 100644 --- a/runtime/gc/reference_processor.cc +++ b/runtime/gc/reference_processor.cc @@ -30,8 +30,13 @@ namespace gc { ReferenceProcessor::ReferenceProcessor() : process_references_args_(nullptr, nullptr, nullptr), - preserving_references_(false), lock_("reference processor lock", kReferenceProcessorLock), - condition_("reference processor condition", lock_) { + preserving_references_(false), + condition_("reference processor condition", *Locks::reference_processor_lock_) , + soft_reference_queue_(Locks::reference_queue_soft_references_lock_), + weak_reference_queue_(Locks::reference_queue_weak_references_lock_), + finalizer_reference_queue_(Locks::reference_queue_finalizer_references_lock_), + phantom_reference_queue_(Locks::reference_queue_phantom_references_lock_), + cleared_references_(Locks::reference_queue_cleared_references_lock_) { } void ReferenceProcessor::EnableSlowPath() { @@ -50,7 +55,7 @@ mirror::Object* ReferenceProcessor::GetReferent(Thread* self, mirror::Reference* if (UNLIKELY(!SlowPathEnabled()) || referent == nullptr) { return referent; } - MutexLock mu(self, lock_); + MutexLock mu(self, *Locks::reference_processor_lock_); while (SlowPathEnabled()) { mirror::HeapReference* const referent_addr = reference->GetReferentReferenceAddr(); @@ -93,12 +98,12 @@ bool ReferenceProcessor::PreserveSoftReferenceCallback(mirror::HeapReferenceIsEnqueued()) { + CHECK(reference->IsFinalizerReferenceInstance()); + if (Runtime::Current()->IsActiveTransaction()) { + reference->SetPendingNext(reference); + } else { + reference->SetPendingNext(reference); + } + return true; + } + return false; +} + } // namespace gc } // namespace art -- cgit v1.2.3-59-g8ed1b