diff options
Diffstat (limited to 'runtime/class_linker.cc')
-rw-r--r-- | runtime/class_linker.cc | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/runtime/class_linker.cc b/runtime/class_linker.cc index ce75c2dd35..ac9dda637a 100644 --- a/runtime/class_linker.cc +++ b/runtime/class_linker.cc @@ -11164,6 +11164,28 @@ void ClassLinker::RemoveDexFromCaches(const DexFile& dex_file) { } } +// GetClassLoadersVisitor collects visited class loaders. +class GetClassLoadersVisitor : public ClassLoaderVisitor { + public: + explicit GetClassLoadersVisitor(VariableSizedHandleScope* class_loaders) + : class_loaders_(class_loaders) {} + + void Visit(ObjPtr<mirror::ClassLoader> class_loader) + REQUIRES_SHARED(Locks::classlinker_classes_lock_, Locks::mutator_lock_) override { + DCHECK(class_loader != nullptr); + class_loaders_->NewHandle(class_loader); + } + + private: + VariableSizedHandleScope* const class_loaders_; +}; + +void ClassLinker::GetClassLoaders(Thread* self, VariableSizedHandleScope* handles) { + GetClassLoadersVisitor class_loader_visitor(handles); + ReaderMutexLock mu(self, *Locks::classlinker_classes_lock_); + VisitClassLoaders(&class_loader_visitor); +} + // Instantiate ClassLinker::AllocClass. template ObjPtr<mirror::Class> ClassLinker::AllocClass</* kMovable= */ true>( Thread* self, |