diff options
| author | 2017-01-12 18:58:38 +0000 | |
|---|---|---|
| committer | 2017-01-12 18:58:39 +0000 | |
| commit | 9e68f5043323eaf4543ebf3b6f496145d8ae77a2 (patch) | |
| tree | bc6b03ddb6a20697709d92151a188c1f17458a25 /runtime/gc/reference_processor.cc | |
| parent | 7620a3b58a9286fae376f4705b602310e5fd464a (diff) | |
| parent | 65f5f247a367af9d6b9ac63767b69ecf3ab079bc (diff) | |
Merge "Fix race condition btw DelayReferenceRefernent vs Reference.clear()."
Diffstat (limited to 'runtime/gc/reference_processor.cc')
| -rw-r--r-- | runtime/gc/reference_processor.cc | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/runtime/gc/reference_processor.cc b/runtime/gc/reference_processor.cc index 081be968eb..c1548365c7 100644 --- a/runtime/gc/reference_processor.cc +++ b/runtime/gc/reference_processor.cc @@ -203,7 +203,9 @@ void ReferenceProcessor::DelayReferenceReferent(ObjPtr<mirror::Class> klass, DCHECK(klass != nullptr); DCHECK(klass->IsTypeOfReferenceClass()); mirror::HeapReference<mirror::Object>* referent = ref->GetReferentReferenceAddr(); - if (referent->AsMirrorPtr() != nullptr && !collector->IsMarkedHeapReference(referent)) { + // do_atomic_update needs to be true because this happens outside of the reference processing + // phase. + if (!collector->IsNullOrMarkedHeapReference(referent, /*do_atomic_update*/true)) { Thread* self = Thread::Current(); // TODO: Remove these locks, and use atomic stacks for storing references? // We need to check that the references haven't already been enqueued since we can end up |