Commit 727d6dff authored by Mathieu Chartier's avatar Mathieu Chartier
Browse files

Revert "Revert "(dl)Close native libraries on unload""

This reverts commit 0cf0dbd5.
parent b652da7a
......@@ -74,6 +74,10 @@ class SharedLibrary {
if (self != nullptr) {
self->GetJniEnv()->DeleteWeakGlobalRef(class_loader_);
}
if (!needs_native_bridge_) {
android::CloseNativeLibrary(handle_);
}
}
jweak GetClassLoader() const {
......@@ -271,8 +275,7 @@ class Libraries {
REQUIRES(!Locks::jni_libraries_lock_)
SHARED_REQUIRES(Locks::mutator_lock_) {
ScopedObjectAccessUnchecked soa(Thread::Current());
typedef void (*JNI_OnUnloadFn)(JavaVM*, void*);
std::vector<JNI_OnUnloadFn> unload_functions;
std::vector<SharedLibrary*> unload_libraries;
{
MutexLock mu(soa.Self(), *Locks::jni_libraries_lock_);
for (auto it = libraries_.begin(); it != libraries_.end(); ) {
......@@ -283,15 +286,7 @@ class Libraries {
// the native libraries of the boot class loader.
if (class_loader != nullptr &&
soa.Self()->IsJWeakCleared(class_loader)) {
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;
unload_libraries.push_back(library);
it = libraries_.erase(it);
} else {
++it;
......@@ -299,9 +294,17 @@ class Libraries {
}
}
// Do this without holding the jni libraries lock to prevent possible deadlocks.
for (JNI_OnUnloadFn fn : unload_functions) {
VLOG(jni) << "Calling JNI_OnUnload";
(*fn)(soa.Vm(), nullptr);
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;
}
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment