diff options
Diffstat (limited to 'runtime/mirror/class-refvisitor-inl.h')
-rw-r--r-- | runtime/mirror/class-refvisitor-inl.h | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/runtime/mirror/class-refvisitor-inl.h b/runtime/mirror/class-refvisitor-inl.h index 8c85387d6a..1dd7c107d4 100644 --- a/runtime/mirror/class-refvisitor-inl.h +++ b/runtime/mirror/class-refvisitor-inl.h @@ -30,6 +30,11 @@ template <bool kVisitNativeRoots, ReadBarrierOption kReadBarrierOption, typename Visitor> inline void Class::VisitReferences(ObjPtr<Class> klass, const Visitor& visitor) { + if (kVisitNativeRoots) { + // Since this class is reachable, we must also visit the associated roots when we scan it. + VisitNativeRoots<kReadBarrierOption>( + visitor, Runtime::Current()->GetClassLinker()->GetImagePointerSize()); + } VisitInstanceFieldsReferences<kVerifyFlags, kReadBarrierOption>(klass.Ptr(), visitor); // Right after a class is allocated, but not yet loaded // (ClassStatus::kNotReady, see ClassLinker::LoadClass()), GC may find it @@ -44,18 +49,15 @@ inline void Class::VisitReferences(ObjPtr<Class> klass, const Visitor& visitor) // linked yet. VisitStaticFieldsReferences<kVerifyFlags, kReadBarrierOption>(this, visitor); } - if (kVisitNativeRoots) { - // Since this class is reachable, we must also visit the associated roots when we scan it. - VisitNativeRoots<kReadBarrierOption>( - visitor, Runtime::Current()->GetClassLinker()->GetImagePointerSize()); - } } template<ReadBarrierOption kReadBarrierOption, class Visitor> void Class::VisitNativeRoots(Visitor& visitor, PointerSize pointer_size) { VisitFields<kReadBarrierOption>([&](ArtField* field) REQUIRES_SHARED(art::Locks::mutator_lock_) { field->VisitRoots(visitor); - if (kIsDebugBuild && IsResolved()) { + // TODO: Once concurrent mark-compact GC is made concurrent and stops using + // kVisitNativeRoots, remove the following condition + if (kIsDebugBuild && !kUseUserfaultfd && IsResolved()) { CHECK_EQ(field->GetDeclaringClass<kReadBarrierOption>(), this) << GetStatus() << field->GetDeclaringClass()->PrettyClass() << " != " << PrettyClass(); } |