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
This commit is contained in:
Valentin Shergin 2018-11-30 17:24:57 -08:00 committed by Facebook Github Bot
parent 3c50d04cf2
commit d150cbc298
2 changed files with 10 additions and 4 deletions

View File

@ -9,13 +9,15 @@ namespace facebook {
namespace react {
void ShadowTreeRegistry::add(std::unique_ptr<ShadowTree> &&shadowTree) const {
std::lock_guard<std::mutex> lock(mutex_);
std::unique_lock<folly::SharedMutex> lock(mutex_);
registry_.emplace(shadowTree->getSurfaceId(), std::move(shadowTree));
}
std::unique_ptr<ShadowTree> ShadowTreeRegistry::remove(
SurfaceId surfaceId) const {
std::lock_guard<std::mutex> lock(mutex_);
std::unique_lock<folly::SharedMutex> lock(mutex_);
auto iterator = registry_.find(surfaceId);
auto shadowTree = std::unique_ptr<ShadowTree>(iterator->second.release());
registry_.erase(iterator);
@ -25,7 +27,8 @@ std::unique_ptr<ShadowTree> ShadowTreeRegistry::remove(
bool ShadowTreeRegistry::get(
SurfaceId surfaceId,
std::function<void(const ShadowTree &shadowTree)> callback) const {
std::lock_guard<std::mutex> lock(mutex_);
std::shared_lock<folly::SharedMutex> lock(mutex_);
auto iterator = registry_.find(surfaceId);
if (iterator == registry_.end()) {

View File

@ -5,6 +5,9 @@
#pragma once
#include <folly/SharedMutex.h>
#include <shared_mutex>
#include <react/core/ReactPrimitives.h>
#include <react/uimanager/ShadowTree.h>
@ -46,7 +49,7 @@ class ShadowTreeRegistry final {
std::function<void(const ShadowTree &shadowTree)> callback) const;
private:
mutable std::mutex mutex_;
mutable folly::SharedMutex mutex_;
mutable std::unordered_map<SurfaceId, std::unique_ptr<ShadowTree>>
registry_; // Protected by `mutex_`.
};