diff options
author | 2016-12-09 10:20:54 +0000 | |
---|---|---|
committer | 2016-12-09 13:02:40 +0000 | |
commit | c5798bf82fc0ccd0bb90e0813d8e63df4d0576cc (patch) | |
tree | 89c94659ad977b66f4d2a90981ed7c63c0af636a /compiler/image_writer.cc | |
parent | aea9ffece7eb32f3884a4ad0553e1df4d90fd9e4 (diff) |
Revert^8 "Make sure that const-class linkage is preserved."
Replaced two ReaderMutexLocks with WriterMutexLocks.
Removed some unnecessary debugging output.
Test: m test-art-host
Bug: 30627598
Original-Change-Id: Ie9b721464b4e9a5dcce8df8095548e983bba1fe8
This reverts commit 2c8c6b63da6ecb2ac701cc30f9b4fa4a8eea5cc8.
Change-Id: I3a1aeecf64e4b202cef61cceb248d48106a2f4a6
Diffstat (limited to 'compiler/image_writer.cc')
-rw-r--r-- | compiler/image_writer.cc | 88 |
1 files changed, 67 insertions, 21 deletions
diff --git a/compiler/image_writer.cc b/compiler/image_writer.cc index 0fb2a8bf17..a47e711c28 100644 --- a/compiler/image_writer.cc +++ b/compiler/image_writer.cc @@ -838,21 +838,73 @@ bool ImageWriter::KeepClass(Class* klass) { return true; } -class ImageWriter::NonImageClassesVisitor : public ClassVisitor { +class ImageWriter::PruneClassesVisitor : public ClassVisitor { public: - explicit NonImageClassesVisitor(ImageWriter* image_writer) : image_writer_(image_writer) {} + PruneClassesVisitor(ImageWriter* image_writer, ObjPtr<mirror::ClassLoader> class_loader) + : image_writer_(image_writer), + class_loader_(class_loader), + classes_to_prune_(), + defined_class_count_(0u) { } - bool operator()(ObjPtr<Class> klass) OVERRIDE REQUIRES_SHARED(Locks::mutator_lock_) { + bool operator()(ObjPtr<mirror::Class> klass) OVERRIDE REQUIRES_SHARED(Locks::mutator_lock_) { if (!image_writer_->KeepClass(klass.Ptr())) { classes_to_prune_.insert(klass.Ptr()); + if (klass->GetClassLoader() == class_loader_) { + ++defined_class_count_; + } } return true; } + size_t Prune() REQUIRES_SHARED(Locks::mutator_lock_) { + ClassTable* class_table = + Runtime::Current()->GetClassLinker()->ClassTableForClassLoader(class_loader_); + for (mirror::Class* klass : classes_to_prune_) { + std::string storage; + const char* descriptor = klass->GetDescriptor(&storage); + bool result = class_table->Remove(descriptor); + DCHECK(result); + DCHECK(!class_table->Remove(descriptor)) << descriptor; + } + return defined_class_count_; + } + + private: + ImageWriter* const image_writer_; + const ObjPtr<mirror::ClassLoader> class_loader_; std::unordered_set<mirror::Class*> classes_to_prune_; + size_t defined_class_count_; +}; + +class ImageWriter::PruneClassLoaderClassesVisitor : public ClassLoaderVisitor { + public: + explicit PruneClassLoaderClassesVisitor(ImageWriter* image_writer) + : image_writer_(image_writer), removed_class_count_(0) {} + + virtual void Visit(ObjPtr<mirror::ClassLoader> class_loader) OVERRIDE + REQUIRES_SHARED(Locks::mutator_lock_) { + PruneClassesVisitor classes_visitor(image_writer_, class_loader); + ClassTable* class_table = + Runtime::Current()->GetClassLinker()->ClassTableForClassLoader(class_loader); + class_table->Visit(classes_visitor); + removed_class_count_ += classes_visitor.Prune(); + } + + size_t GetRemovedClassCount() const { + return removed_class_count_; + } + + private: ImageWriter* const image_writer_; + size_t removed_class_count_; }; +void ImageWriter::VisitClassLoaders(ClassLoaderVisitor* visitor) { + WriterMutexLock mu(Thread::Current(), *Locks::classlinker_classes_lock_); + visitor->Visit(nullptr); // Visit boot class loader. + Runtime::Current()->GetClassLinker()->VisitClassLoaders(visitor); +} + void ImageWriter::PruneNonImageClasses() { Runtime* runtime = Runtime::Current(); ClassLinker* class_linker = runtime->GetClassLinker(); @@ -862,21 +914,11 @@ void ImageWriter::PruneNonImageClasses() { // path dex caches. class_linker->ClearClassTableStrongRoots(); - // Make a list of classes we would like to prune. - NonImageClassesVisitor visitor(this); - class_linker->VisitClasses(&visitor); - // Remove the undesired classes from the class roots. - VLOG(compiler) << "Pruning " << visitor.classes_to_prune_.size() << " classes"; - for (mirror::Class* klass : visitor.classes_to_prune_) { - std::string temp; - const char* name = klass->GetDescriptor(&temp); - VLOG(compiler) << "Pruning class " << name; - if (!compile_app_image_) { - DCHECK(IsBootClassLoaderClass(klass)); - } - bool result = class_linker->RemoveClass(name, klass->GetClassLoader()); - DCHECK(result); + { + PruneClassLoaderClassesVisitor class_loader_visitor(this); + VisitClassLoaders(&class_loader_visitor); + VLOG(compiler) << "Pruned " << class_loader_visitor.GetRemovedClassCount() << " classes"; } // Clear references to removed classes from the DexCaches. @@ -1508,8 +1550,10 @@ void ImageWriter::CalculateNewObjectOffsets() { } // Calculate the size of the class table. ReaderMutexLock mu(self, *Locks::classlinker_classes_lock_); - DCHECK_EQ(image_info.class_table_->NumZygoteClasses(), 0u); - if (image_info.class_table_->NumNonZygoteClasses() != 0u) { + CHECK_EQ(class_loaders_.size(), compile_app_image_ ? 1u : 0u); + mirror::ClassLoader* class_loader = compile_app_image_ ? *class_loaders_.begin() : nullptr; + DCHECK_EQ(image_info.class_table_->NumZygoteClasses(class_loader), 0u); + if (image_info.class_table_->NumNonZygoteClasses(class_loader) != 0u) { image_info.class_table_bytes_ += image_info.class_table_->WriteToMemory(nullptr); } } @@ -1854,8 +1898,10 @@ void ImageWriter::CopyAndFixupNativeData(size_t oat_index) { // above comment for intern tables. ClassTable temp_class_table; temp_class_table.ReadFromMemory(class_table_memory_ptr); - CHECK_EQ(temp_class_table.NumZygoteClasses(), table->NumNonZygoteClasses() + - table->NumZygoteClasses()); + CHECK_EQ(class_loaders_.size(), compile_app_image_ ? 1u : 0u); + mirror::ClassLoader* class_loader = compile_app_image_ ? *class_loaders_.begin() : nullptr; + CHECK_EQ(temp_class_table.NumZygoteClasses(class_loader), + table->NumNonZygoteClasses(class_loader) + table->NumZygoteClasses(class_loader)); UnbufferedRootVisitor visitor(&root_visitor, RootInfo(kRootUnknown)); temp_class_table.VisitRoots(visitor); } |