diff --git a/libnativeloader/native_loader.cpp b/libnativeloader/native_loader.cpp index 837924b03..ce893db0f 100644 --- a/libnativeloader/native_loader.cpp +++ b/libnativeloader/native_loader.cpp @@ -80,8 +80,6 @@ class LibraryNamespaces { return nullptr; } - std::lock_guard guard(mutex_); - android_namespace_t* ns = FindNamespaceByClassLoader(env, class_loader); LOG_FATAL_IF(ns != nullptr, "There is already a namespace associated with this classloader"); @@ -142,12 +140,12 @@ class LibraryNamespaces { } bool initialized_; - std::mutex mutex_; std::vector> namespaces_; DISALLOW_COPY_AND_ASSIGN(LibraryNamespaces); }; +static std::mutex g_namespaces_mutex; static LibraryNamespaces* g_namespaces = new LibraryNamespaces; static bool namespaces_enabled(uint32_t target_sdk_version) { @@ -157,6 +155,7 @@ static bool namespaces_enabled(uint32_t target_sdk_version) { void PreloadPublicNativeLibraries() { #if defined(__ANDROID__) + std::lock_guard guard(g_namespaces_mutex); g_namespaces->PreloadPublicLibraries(); #endif } @@ -173,6 +172,7 @@ jstring CreateClassLoaderNamespace(JNIEnv* env, return nullptr; } + std::lock_guard guard(g_namespaces_mutex); android_namespace_t* ns = g_namespaces->Create(env, class_loader, is_shared, @@ -199,6 +199,7 @@ void* OpenNativeLibrary(JNIEnv* env, return dlopen(path, RTLD_NOW); } + std::lock_guard guard(g_namespaces_mutex); android_namespace_t* ns = g_namespaces->FindNamespaceByClassLoader(env, class_loader); if (ns == nullptr) { @@ -223,6 +224,7 @@ void* OpenNativeLibrary(JNIEnv* env, #if defined(__ANDROID__) android_namespace_t* FindNamespaceByClassLoader(JNIEnv* env, jobject class_loader) { + std::lock_guard guard(g_namespaces_mutex); return g_namespaces->FindNamespaceByClassLoader(env, class_loader); } #endif