diff options
author | Hiroshi Yamauchi <yamauchi@google.com> | 2014-05-29 12:16:04 -0700 |
---|---|---|
committer | Hiroshi Yamauchi <yamauchi@google.com> | 2014-05-29 12:37:49 -0700 |
commit | 196851b634a5bfdd8ab3fb59a320e550b21b0f4d (patch) | |
tree | f9fca2858b6213163d358c2eb2b2f88aa88a027b /runtime/indirect_reference_table-inl.h | |
parent | ea0b6e284cab12eed88eebf6aa19e6292af57389 (diff) | |
download | art-196851b634a5bfdd8ab3fb59a320e550b21b0f4d.tar.gz art-196851b634a5bfdd8ab3fb59a320e550b21b0f4d.tar.bz2 art-196851b634a5bfdd8ab3fb59a320e550b21b0f4d.zip |
Add read barriers for the weak roots in the JNI weak globals.
Bug: 12687968
Change-Id: Ic265a0e162e8cc9edc4ab7fa34f8afd5ce968d08
Diffstat (limited to 'runtime/indirect_reference_table-inl.h')
-rw-r--r-- | runtime/indirect_reference_table-inl.h | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/runtime/indirect_reference_table-inl.h b/runtime/indirect_reference_table-inl.h index 42a9757951..790f4d0c17 100644 --- a/runtime/indirect_reference_table-inl.h +++ b/runtime/indirect_reference_table-inl.h @@ -71,12 +71,16 @@ inline bool IndirectReferenceTable::CheckEntry(const char* what, IndirectRef ire return true; } +template<ReadBarrierOption kReadBarrierOption> inline mirror::Object* IndirectReferenceTable::Get(IndirectRef iref) const { if (!GetChecked(iref)) { return kInvalidIndirectRefObject; } - mirror::Object* obj = table_[ExtractIndex(iref)]; + mirror::Object** root = &table_[ExtractIndex(iref)]; + mirror::Object* obj = *root; if (LIKELY(obj != kClearedJniWeakGlobal)) { + // The read barrier or VerifyObject won't handle kClearedJniWeakGlobal. + obj = ReadBarrier::BarrierForWeakRoot<mirror::Object, kReadBarrierOption>(root); VerifyObject(obj); } return obj; |