summaryrefslogtreecommitdiff
path: root/runtime/mirror/reference.h
diff options
context:
space:
mode:
author Hiroshi Yamauchi <yamauchi@google.com> 2014-05-09 12:21:15 -0700
committer Hiroshi Yamauchi <yamauchi@google.com> 2014-05-09 12:21:15 -0700
commitbfff21aaa05d4fce39481cf7899f7639eb7fd66d (patch)
tree489efb8743f63ccb1e45197f4ae4c6e67cb9c1c4 /runtime/mirror/reference.h
parent25023c744c4388a6459b21cc3babf8c602b024a2 (diff)
Reference::GetReferent() calls by GC should not trigger read barriers.
Otherwise, GC's reference processing would turn all referents alive via read barriers, which is incorrect. Bug: 12687968 Change-Id: I1463365981d55fa74a7bb207dd4a16aeec007f8b
Diffstat (limited to 'runtime/mirror/reference.h')
-rw-r--r--runtime/mirror/reference.h4
1 files changed, 3 insertions, 1 deletions
diff --git a/runtime/mirror/reference.h b/runtime/mirror/reference.h
index cf65d2093b..0b6e759097 100644
--- a/runtime/mirror/reference.h
+++ b/runtime/mirror/reference.h
@@ -42,8 +42,10 @@ class MANAGED Reference : public Object {
return OFFSET_OF_OBJECT_MEMBER(Reference, referent_);
}
+ template<ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
Object* GetReferent() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
- return GetFieldObjectVolatile<Object>(ReferentOffset());
+ return GetFieldObjectVolatile<Object, kDefaultVerifyFlags, kReadBarrierOption>(
+ ReferentOffset());
}
template<bool kTransactionActive>
void SetReferent(Object* referent) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {