From 3049324f4ef71b5d7a3de49bd77c75f07dbf8f3a Mon Sep 17 00:00:00 2001 From: Hiroshi Yamauchi Date: Thu, 3 Nov 2016 13:06:52 -0700 Subject: Make empty checkpoint work while weak ref access is disabled. Fix a potential race on PushOntoMarkStack for CC by running an empty checkpoint (while weak ref access is disabled). Bug: 32508093 Bug: 12687968 Test: test-art-host with CC/CMS, libartd boot with N9, Ritz EAAC. Change-Id: I3749bb525e7734804307ee16262355f3fc730312 --- runtime/gc/reference_processor.cc | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'runtime/gc/reference_processor.cc') diff --git a/runtime/gc/reference_processor.cc b/runtime/gc/reference_processor.cc index 798ecd3d87..2cde7d5731 100644 --- a/runtime/gc/reference_processor.cc +++ b/runtime/gc/reference_processor.cc @@ -55,7 +55,6 @@ void ReferenceProcessor::DisableSlowPath(Thread* self) { } void ReferenceProcessor::BroadcastForSlowPath(Thread* self) { - CHECK(kUseReadBarrier); MutexLock mu(self, *Locks::reference_processor_lock_); condition_.Broadcast(self); } @@ -99,6 +98,9 @@ ObjPtr ReferenceProcessor::GetReferent(Thread* self, } } } + // Check and run the empty checkpoint before blocking so the empty checkpoint will work in the + // presence of threads blocking for weak ref access. + self->CheckEmptyCheckpoint(); condition_.WaitHoldingLocks(self); } return reference->GetReferent(); @@ -270,6 +272,9 @@ bool ReferenceProcessor::MakeCircularListIfUnenqueued( // Wait untul we are done processing reference. while ((!kUseReadBarrier && SlowPathEnabled()) || (kUseReadBarrier && !self->GetWeakRefAccessEnabled())) { + // Check and run the empty checkpoint before blocking so the empty checkpoint will work in the + // presence of threads blocking for weak ref access. + self->CheckEmptyCheckpoint(); condition_.WaitHoldingLocks(self); } // At this point, since the sentinel of the reference is live, it is guaranteed to not be -- cgit v1.2.3-59-g8ed1b