summaryrefslogtreecommitdiff
path: root/runtime/gc/reference_processor.cc
diff options
context:
space:
mode:
author Hiroshi Yamauchi <yamauchi@google.com> 2017-01-12 18:58:38 +0000
committer Gerrit Code Review <noreply-gerritcodereview@google.com> 2017-01-12 18:58:39 +0000
commit9e68f5043323eaf4543ebf3b6f496145d8ae77a2 (patch)
treebc6b03ddb6a20697709d92151a188c1f17458a25 /runtime/gc/reference_processor.cc
parent7620a3b58a9286fae376f4705b602310e5fd464a (diff)
parent65f5f247a367af9d6b9ac63767b69ecf3ab079bc (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.cc4
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