From e47172b75b8b04a450d235cf72bdc4e223a29cb5 Mon Sep 17 00:00:00 2001 From: Vladimir Marko Date: Fri, 25 Nov 2016 11:47:20 +0000 Subject: Revert "Revert "Revert "Revert "Make sure that const-class linkage is preserved."""" Avoid class loading triggered by verification in the 626-const-class-linking test. Expect spurious wakeups. Add extra debugging output for a very strange failure image_writer.cc:1144] Check failed: !IsBootClassLoaderClass(as_klass) java.lang.Class That class is supposed to be in the boot image (core.art for tests), so the failing check should not be reached at all. Test: m test-art-host Test: m ART_TEST_OPTIMIZING=true \ ART_TEST_JIT=true \ ART_TEST_INTERPRETER=true \ ART_TEST_INTERPRETER_ACCESS_CHECKS=true \ test-art-host-run-test-626-const-class-linking Bug: 30627598 This reverts commit 09ded9201fbeec605b12741ae255663c14bda225. Change-Id: I65a68cb53f0707b8abb3555ac3dc44c82907aef5 --- runtime/class_table.cc | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) (limited to 'runtime/class_table.cc') diff --git a/runtime/class_table.cc b/runtime/class_table.cc index 0fcce6b307..81cdce57a8 100644 --- a/runtime/class_table.cc +++ b/runtime/class_table.cc @@ -83,18 +83,29 @@ mirror::Class* ClassTable::UpdateClass(const char* descriptor, mirror::Class* kl #pragma clang diagnostic pop // http://b/31104323 -size_t ClassTable::NumZygoteClasses() const { +size_t ClassTable::CountDefiningLoaderClasses(ObjPtr defining_loader, + const ClassSet& set) const { + size_t count = 0; + for (const GcRoot& klass : set) { + if (klass.Read()->GetClassLoader() == defining_loader) { + ++count; + } + } + return count; +} + +size_t ClassTable::NumZygoteClasses(ObjPtr defining_loader) const { ReaderMutexLock mu(Thread::Current(), lock_); size_t sum = 0; for (size_t i = 0; i < classes_.size() - 1; ++i) { - sum += classes_[i].Size(); + sum += CountDefiningLoaderClasses(defining_loader, classes_[i]); } return sum; } -size_t ClassTable::NumNonZygoteClasses() const { +size_t ClassTable::NumNonZygoteClasses(ObjPtr defining_loader) const { ReaderMutexLock mu(Thread::Current(), lock_); - return classes_.back().Size(); + return CountDefiningLoaderClasses(defining_loader, classes_.back()); } mirror::Class* ClassTable::Lookup(const char* descriptor, size_t hash) { @@ -102,7 +113,7 @@ mirror::Class* ClassTable::Lookup(const char* descriptor, size_t hash) { for (ClassSet& class_set : classes_) { auto it = class_set.FindWithHash(descriptor, hash); if (it != class_set.end()) { - return it->Read(); + return it->Read(); } } return nullptr; @@ -142,7 +153,6 @@ uint32_t ClassTable::ClassDescriptorHashEquals::operator()(const GcRoot& a, const GcRoot& b) const { - DCHECK_EQ(a.Read()->GetClassLoader(), b.Read()->GetClassLoader()); std::string temp; return a.Read()->DescriptorEquals(b.Read()->GetDescriptor(&temp)); } -- cgit v1.2.3-59-g8ed1b