summaryrefslogtreecommitdiff
path: root/runtime/java_vm_ext.cc
diff options
context:
space:
mode:
author Mathieu Chartier <mathieuc@google.com> 2016-05-10 17:31:48 -0700
committer Mathieu Chartier <mathieuc@google.com> 2016-05-10 17:36:33 -0700
commit73ad16e0193866d36dbd4088ac77fa5d4ceec334 (patch)
treef8562c875e02a0fc97828e2ab426adf6f40bd67e /runtime/java_vm_ext.cc
parentb88a2caa9af584ed6bd49e75f79527480393a5d1 (diff)
Revert some flaky unloading
Revert "Revert "Revert "Remove double unloading hack""" This reverts commit c0f2e678e45ff191f90651117f4e238caa521b80. Revert "Revert "Revert "Revert "Revert "(dl)Close native libraries on unload""""" This reverts commit 33bae7d52debe898879fc034a5524b1b165dbd88. Still flaky. Bug: 28406866 Change-Id: I31a9ace17c676ac615ed04a9f4ac51582fca55d9
Diffstat (limited to 'runtime/java_vm_ext.cc')
-rw-r--r--runtime/java_vm_ext.cc31
1 files changed, 14 insertions, 17 deletions
diff --git a/runtime/java_vm_ext.cc b/runtime/java_vm_ext.cc
index c2164126e1..d983a9fa19 100644
--- a/runtime/java_vm_ext.cc
+++ b/runtime/java_vm_ext.cc
@@ -74,10 +74,6 @@ class SharedLibrary {
if (self != nullptr) {
self->GetJniEnv()->DeleteWeakGlobalRef(class_loader_);
}
-
- if (!needs_native_bridge_) {
- android::CloseNativeLibrary(handle_);
- }
}
jweak GetClassLoader() const {
@@ -275,7 +271,8 @@ class Libraries {
REQUIRES(!Locks::jni_libraries_lock_)
SHARED_REQUIRES(Locks::mutator_lock_) {
ScopedObjectAccessUnchecked soa(Thread::Current());
- std::vector<SharedLibrary*> unload_libraries;
+ typedef void (*JNI_OnUnloadFn)(JavaVM*, void*);
+ std::vector<JNI_OnUnloadFn> unload_functions;
{
MutexLock mu(soa.Self(), *Locks::jni_libraries_lock_);
for (auto it = libraries_.begin(); it != libraries_.end(); ) {
@@ -286,7 +283,15 @@ class Libraries {
// the native libraries of the boot class loader.
if (class_loader != nullptr &&
soa.Self()->IsJWeakCleared(class_loader)) {
- unload_libraries.push_back(library);
+ void* const sym = library->FindSymbol("JNI_OnUnload", nullptr);
+ if (sym == nullptr) {
+ VLOG(jni) << "[No JNI_OnUnload found in \"" << library->GetPath() << "\"]";
+ } else {
+ VLOG(jni) << "[JNI_OnUnload found for \"" << library->GetPath() << "\"]";
+ JNI_OnUnloadFn jni_on_unload = reinterpret_cast<JNI_OnUnloadFn>(sym);
+ unload_functions.push_back(jni_on_unload);
+ }
+ delete library;
it = libraries_.erase(it);
} else {
++it;
@@ -294,17 +299,9 @@ class Libraries {
}
}
// Do this without holding the jni libraries lock to prevent possible deadlocks.
- typedef void (*JNI_OnUnloadFn)(JavaVM*, void*);
- for (auto library : unload_libraries) {
- void* const sym = library->FindSymbol("JNI_OnUnload", nullptr);
- if (sym == nullptr) {
- VLOG(jni) << "[No JNI_OnUnload found in \"" << library->GetPath() << "\"]";
- } else {
- VLOG(jni) << "[JNI_OnUnload found for \"" << library->GetPath() << "\"]: Calling...";
- JNI_OnUnloadFn jni_on_unload = reinterpret_cast<JNI_OnUnloadFn>(sym);
- jni_on_unload(soa.Vm(), nullptr);
- }
- delete library;
+ for (JNI_OnUnloadFn fn : unload_functions) {
+ VLOG(jni) << "Calling JNI_OnUnload";
+ (*fn)(soa.Vm(), nullptr);
}
}