diff options
| -rw-r--r-- | runtime/jni_internal.cc | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/runtime/jni_internal.cc b/runtime/jni_internal.cc index 80ca5fb654..30b4ee83e0 100644 --- a/runtime/jni_internal.cc +++ b/runtime/jni_internal.cc @@ -523,6 +523,12 @@ class SharedLibrary { return dlsym(handle_, symbol_name.c_str()); } + void VisitRoots(RootVisitor* visitor, void* arg) { + if (class_loader_ != nullptr) { + class_loader_ = visitor(class_loader_, arg); + } + } + private: enum JNI_OnLoadState { kPending, @@ -613,6 +619,12 @@ class Libraries { return NULL; } + void VisitRoots(RootVisitor* visitor, void* arg) { + for (auto& lib_pair : libraries_) { + lib_pair.second->VisitRoots(visitor, arg); + } + } + private: SafeMap<std::string, SharedLibrary*> libraries_; }; @@ -3385,6 +3397,11 @@ void JavaVMExt::VisitRoots(RootVisitor* visitor, void* arg) { MutexLock mu(self, pins_lock); pin_table.VisitRoots(visitor, arg); } + { + MutexLock mu(self, libraries_lock); + // Libraries contains shared libraries which hold a pointer to a class loader. + libraries->VisitRoots(visitor, arg); + } // The weak_globals table is visited by the GC itself (because it mutates the table). } |