From d150cbc29825753be7efcaebbc636f2b23106a1a Mon Sep 17 00:00:00 2001 From: Valentin Shergin Date: Fri, 30 Nov 2018 17:24:57 -0800 Subject: [PATCH] Fabric: Using RW-like shared lock in ShadowTreeRegistry Summary: `ShadowTree` class is already thread-safe, so we don't need to (we should not) guard concurent access to it. We should guard concurrent write-access to the collection of them though. Note that unordered_map is "thread-compatible" collection, so concurrent reading access is okay. Reviewed By: mdvacca Differential Revision: D13269745 fbshipit-source-id: 4779626018da0e42b81a835e538f6c1d1a8e25f7 --- ReactCommon/fabric/uimanager/ShadowTreeRegistry.cpp | 9 ++++++--- ReactCommon/fabric/uimanager/ShadowTreeRegistry.h | 5 ++++- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/ReactCommon/fabric/uimanager/ShadowTreeRegistry.cpp b/ReactCommon/fabric/uimanager/ShadowTreeRegistry.cpp index 01a6ab7ca..acde471a5 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 1bd300f1f..5df5fc0bb 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_`. };