diff --git a/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/Binding.cpp b/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/Binding.cpp index d9f1cb088bc..9fde6bc9feb 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/Binding.cpp +++ b/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/Binding.cpp @@ -223,13 +223,13 @@ jni::local_ref Binding::initHybrid( // Thread-safe getter jni::global_ref Binding::getJavaUIManager() { - std::lock_guard uiManagerLock(javaUIManagerMutex_); + std::shared_lock lock(installMutex_); return javaUIManager_; } // Thread-safe getter std::shared_ptr Binding::getScheduler() { - std::lock_guard lock(schedulerMutex_); + std::shared_lock lock(installMutex_); return scheduler_; } @@ -521,10 +521,7 @@ void Binding::installFabricUIManager( // Use std::lock and std::adopt_lock to prevent deadlocks by locking mutexes // at the same time - std::lock(schedulerMutex_, javaUIManagerMutex_); - std::lock_guard schedulerLock(schedulerMutex_, std::adopt_lock); - std::lock_guard uiManagerLock( - javaUIManagerMutex_, std::adopt_lock); + std::unique_lock lock(installMutex_); javaUIManager_ = make_global(javaUIManager); @@ -625,13 +622,8 @@ void Binding::uninstallFabricUIManager() { LOG(WARNING) << "Binding::uninstallFabricUIManager() was called (address: " << this << ")."; } - // Use std::lock and std::adopt_lock to prevent deadlocks by locking mutexes - // at the same time - std::lock(schedulerMutex_, javaUIManagerMutex_); - std::lock_guard schedulerLock(schedulerMutex_, std::adopt_lock); - std::lock_guard uiManagerLock( - javaUIManagerMutex_, std::adopt_lock); + std::unique_lock lock(installMutex_); animationDriver_ = nullptr; scheduler_ = nullptr; javaUIManager_ = nullptr; diff --git a/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/Binding.h b/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/Binding.h index 3d8ef22fd82..598974f7027 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/Binding.h +++ b/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/Binding.h @@ -178,8 +178,9 @@ class Binding : public jni::HybridClass, void uninstallFabricUIManager(); // Private member variables + better::shared_mutex installMutex_; jni::global_ref javaUIManager_; - std::mutex javaUIManagerMutex_; + std::shared_ptr scheduler_; // LayoutAnimations void onAnimationStarted() override; @@ -187,9 +188,6 @@ class Binding : public jni::HybridClass, std::shared_ptr animationDriver_; std::unique_ptr backgroundExecutor_; - std::shared_ptr scheduler_; - std::mutex schedulerMutex_; - better::map surfaceHandlerRegistry_{}; better::shared_mutex surfaceHandlerRegistryMutex_; // Protects `surfaceHandlerRegistry_`.