diff --git a/ReactCommon/fabric/uimanager/ShadowTreeRegistry.cpp b/ReactCommon/fabric/uimanager/ShadowTreeRegistry.cpp index 01a6ab7cad1..acde471a524 100644 --- a/ReactCommon/fabric/uimanager/ShadowTreeRegistry.cpp +++ b/ReactCommon/fabric/uimanager/ShadowTreeRegistry.cpp @@ -9,13 +9,15 @@ namespace facebook { namespace react { void ShadowTreeRegistry::add(std::unique_ptr &&shadowTree) const { - std::lock_guard lock(mutex_); + std::unique_lock lock(mutex_); + registry_.emplace(shadowTree->getSurfaceId(), std::move(shadowTree)); } std::unique_ptr ShadowTreeRegistry::remove( SurfaceId surfaceId) const { - std::lock_guard lock(mutex_); + std::unique_lock lock(mutex_); + auto iterator = registry_.find(surfaceId); auto shadowTree = std::unique_ptr(iterator->second.release()); registry_.erase(iterator); @@ -25,7 +27,8 @@ std::unique_ptr ShadowTreeRegistry::remove( bool ShadowTreeRegistry::get( SurfaceId surfaceId, std::function callback) const { - std::lock_guard lock(mutex_); + std::shared_lock lock(mutex_); + auto iterator = registry_.find(surfaceId); if (iterator == registry_.end()) { diff --git a/ReactCommon/fabric/uimanager/ShadowTreeRegistry.h b/ReactCommon/fabric/uimanager/ShadowTreeRegistry.h index 1bd300f1f75..5df5fc0bb56 100644 --- a/ReactCommon/fabric/uimanager/ShadowTreeRegistry.h +++ b/ReactCommon/fabric/uimanager/ShadowTreeRegistry.h @@ -5,6 +5,9 @@ #pragma once +#include +#include + #include #include @@ -46,7 +49,7 @@ class ShadowTreeRegistry final { std::function callback) const; private: - mutable std::mutex mutex_; + mutable folly::SharedMutex mutex_; mutable std::unordered_map> registry_; // Protected by `mutex_`. };