diff --git a/RNTester/ComponentRegistry.cpp b/RNTester/ComponentRegistry.cpp index 44ec5759f..a2ead4fd6 100644 --- a/RNTester/ComponentRegistry.cpp +++ b/RNTester/ComponentRegistry.cpp @@ -28,7 +28,7 @@ namespace react { */ ComponentRegistryFactory getDefaultComponentRegistryFactory() { return [](const EventDispatcher::Shared &eventDispatcher, - const SharedContextContainer &contextContainer) { + const ContextContainer::Shared &contextContainer) { auto registry = std::make_shared(); registry->registerComponentDescriptor(std::make_shared(eventDispatcher)); registry->registerComponentDescriptor(std::make_shared(eventDispatcher, contextContainer)); diff --git a/React/Fabric/RCTScheduler.h b/React/Fabric/RCTScheduler.h index d5ea6530d..8d2f453b3 100644 --- a/React/Fabric/RCTScheduler.h +++ b/React/Fabric/RCTScheduler.h @@ -13,6 +13,7 @@ #import #import #import +#import NS_ASSUME_NONNULL_BEGIN @@ -37,7 +38,7 @@ NS_ASSUME_NONNULL_BEGIN @property (atomic, weak, nullable) id delegate; -- (instancetype)initWithContextContainer:(std::shared_ptr)contextContatiner; +- (instancetype)initWithContextContainer:(facebook::react::ContextContainer::Shared)contextContatiner; - (void)startSurfaceWithSurfaceId:(facebook::react::SurfaceId)surfaceId moduleName:(NSString *)moduleName diff --git a/React/Fabric/RCTScheduler.mm b/React/Fabric/RCTScheduler.mm index 3594c3c03..b9d1f6f69 100644 --- a/React/Fabric/RCTScheduler.mm +++ b/React/Fabric/RCTScheduler.mm @@ -11,7 +11,6 @@ #import #import #import -#import #import @@ -48,12 +47,11 @@ class SchedulerDelegateProxy : public SchedulerDelegate { std::shared_ptr _delegateProxy; } -- (instancetype)initWithContextContainer:(std::shared_ptr)contextContainer +- (instancetype)initWithContextContainer:(ContextContainer::Shared)contextContainer { if (self = [super init]) { _delegateProxy = std::make_shared((__bridge void *)self); - _scheduler = std::make_shared( - std::static_pointer_cast(contextContainer), getDefaultComponentRegistryFactory()); + _scheduler = std::make_shared(contextContainer, getDefaultComponentRegistryFactory()); _scheduler->setDelegate(_delegateProxy.get()); } diff --git a/React/Fabric/RCTSurfacePresenter.h b/React/Fabric/RCTSurfacePresenter.h index 07c312bdd..f6a2e1a44 100644 --- a/React/Fabric/RCTSurfacePresenter.h +++ b/React/Fabric/RCTSurfacePresenter.h @@ -41,7 +41,7 @@ NS_ASSUME_NONNULL_BEGIN config:(std::shared_ptr)config; @property (nonatomic, readonly) RCTComponentViewFactory *componentViewFactory; -@property (nonatomic, readonly) facebook::react::SharedContextContainer contextContainer; +@property (nonatomic, readonly) facebook::react::ContextContainer::Shared contextContainer; @end diff --git a/React/Fabric/RCTSurfacePresenter.mm b/React/Fabric/RCTSurfacePresenter.mm index bfb00efa6..eebbb84be 100644 --- a/React/Fabric/RCTSurfacePresenter.mm +++ b/React/Fabric/RCTSurfacePresenter.mm @@ -201,7 +201,7 @@ using namespace facebook::react; @synthesize contextContainer = _contextContainer; -- (SharedContextContainer)contextContainer +- (ContextContainer::Shared)contextContainer { std::lock_guard lock(_contextContainerMutex); diff --git a/ReactAndroid/src/main/java/com/facebook/react/fabric/jsi/jni/Binding.cpp b/ReactAndroid/src/main/java/com/facebook/react/fabric/jsi/jni/Binding.cpp index bb59ca66a..1e89d4dc4 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/fabric/jsi/jni/Binding.cpp +++ b/ReactAndroid/src/main/java/com/facebook/react/fabric/jsi/jni/Binding.cpp @@ -97,7 +97,7 @@ void Binding::installFabricUIManager( jni::alias_ref reactNativeConfig) { javaUIManager_ = make_global(javaUIManager); - SharedContextContainer contextContainer = + ContextContainer::Shared contextContainer = std::make_shared(); auto sharedJSMessageQueueThread = diff --git a/ReactCommon/fabric/components/image/ImageComponentDescriptor.h b/ReactCommon/fabric/components/image/ImageComponentDescriptor.h index 2aa36b0a1..3a535789f 100644 --- a/ReactCommon/fabric/components/image/ImageComponentDescriptor.h +++ b/ReactCommon/fabric/components/image/ImageComponentDescriptor.h @@ -23,7 +23,7 @@ class ImageComponentDescriptor final public: ImageComponentDescriptor( EventDispatcher::Shared eventDispatcher, - const SharedContextContainer &contextContainer) + ContextContainer::Shared const &contextContainer) : ConcreteComponentDescriptor(eventDispatcher), // TODO (39486757): implement image manager on Android, currently Android does // not have an ImageManager so this will crash diff --git a/ReactCommon/fabric/components/slider/SliderComponentDescriptor.h b/ReactCommon/fabric/components/slider/SliderComponentDescriptor.h index 8265249bc..03cd41362 100644 --- a/ReactCommon/fabric/components/slider/SliderComponentDescriptor.h +++ b/ReactCommon/fabric/components/slider/SliderComponentDescriptor.h @@ -22,7 +22,7 @@ class SliderComponentDescriptor final public: SliderComponentDescriptor( EventDispatcher::Shared eventDispatcher, - const SharedContextContainer &contextContainer) + ContextContainer::Shared const &contextContainer) : ConcreteComponentDescriptor(eventDispatcher), // TODO (39486757): implement image manager on Android, currently Android does // not have an ImageManager so this will crash diff --git a/ReactCommon/fabric/components/slider/platform/android/SliderMeasurementsManager.h b/ReactCommon/fabric/components/slider/platform/android/SliderMeasurementsManager.h index 219f9a26f..4b35d9e7d 100644 --- a/ReactCommon/fabric/components/slider/platform/android/SliderMeasurementsManager.h +++ b/ReactCommon/fabric/components/slider/platform/android/SliderMeasurementsManager.h @@ -20,7 +20,7 @@ namespace react { */ class SliderMeasurementsManager { public: - SliderMeasurementsManager(const SharedContextContainer &contextContainer) + SliderMeasurementsManager(const ContextContainer::Shared &contextContainer) : contextContainer_(contextContainer) {} static inline bool shouldMeasureSlider() { @@ -30,7 +30,7 @@ class SliderMeasurementsManager { Size measure(LayoutConstraints layoutConstraints) const; private: - const SharedContextContainer contextContainer_; + const ContextContainer::Shared contextContainer_; mutable std::mutex mutex_; mutable bool hasBeenMeasured_ = false; mutable Size cachedMeasurement_{}; diff --git a/ReactCommon/fabric/components/slider/platform/ios/SliderMeasurementsManager.h b/ReactCommon/fabric/components/slider/platform/ios/SliderMeasurementsManager.h index 814adc9c1..6f51fd1e7 100644 --- a/ReactCommon/fabric/components/slider/platform/ios/SliderMeasurementsManager.h +++ b/ReactCommon/fabric/components/slider/platform/ios/SliderMeasurementsManager.h @@ -20,7 +20,7 @@ namespace react { */ class SliderMeasurementsManager { public: - SliderMeasurementsManager(const SharedContextContainer &contextContainer) {} + SliderMeasurementsManager(ContextContainer::Shared const &contextContainer) {} static inline bool shouldMeasureSlider() { return false; diff --git a/ReactCommon/fabric/components/text/paragraph/ParagraphComponentDescriptor.h b/ReactCommon/fabric/components/text/paragraph/ParagraphComponentDescriptor.h index 542347903..b730d1fd7 100644 --- a/ReactCommon/fabric/components/text/paragraph/ParagraphComponentDescriptor.h +++ b/ReactCommon/fabric/components/text/paragraph/ParagraphComponentDescriptor.h @@ -27,7 +27,7 @@ class ParagraphComponentDescriptor final public: ParagraphComponentDescriptor( EventDispatcher::Shared eventDispatcher, - const SharedContextContainer &contextContainer) + ContextContainer::Shared const &contextContainer) : ConcreteComponentDescriptor(eventDispatcher) { // Every single `ParagraphShadowNode` will have a reference to // a shared `TextLayoutManager`. diff --git a/ReactCommon/fabric/sample/SampleComponentDescriptorFactor.cpp b/ReactCommon/fabric/sample/SampleComponentDescriptorFactor.cpp index e41e919f0..ddcbcd867 100644 --- a/ReactCommon/fabric/sample/SampleComponentDescriptorFactor.cpp +++ b/ReactCommon/fabric/sample/SampleComponentDescriptorFactor.cpp @@ -17,7 +17,7 @@ namespace react { */ ComponentRegistryFactory getDefaultComponentRegistryFactory() { return [](const EventDispatcher::Shared &eventDispatcher, - const SharedContextContainer &contextContainer) { + const ContextContainer::Shared &contextContainer) { auto registry = std::make_shared(); return registry; }; diff --git a/ReactCommon/fabric/textlayoutmanager/platform/android/TextLayoutManager.h b/ReactCommon/fabric/textlayoutmanager/platform/android/TextLayoutManager.h index ebd83c20e..6bc496ba2 100644 --- a/ReactCommon/fabric/textlayoutmanager/platform/android/TextLayoutManager.h +++ b/ReactCommon/fabric/textlayoutmanager/platform/android/TextLayoutManager.h @@ -26,7 +26,7 @@ using SharedTextLayoutManager = std::shared_ptr; */ class TextLayoutManager { public: - TextLayoutManager(const SharedContextContainer &contextContainer) + TextLayoutManager(const ContextContainer::Shared &contextContainer) : contextContainer_(contextContainer){}; ~TextLayoutManager(); @@ -47,7 +47,7 @@ class TextLayoutManager { private: void *self_; - SharedContextContainer contextContainer_; + ContextContainer::Shared contextContainer_; }; } // namespace react diff --git a/ReactCommon/fabric/textlayoutmanager/platform/ios/TextLayoutManager.h b/ReactCommon/fabric/textlayoutmanager/platform/ios/TextLayoutManager.h index 864917830..516322522 100644 --- a/ReactCommon/fabric/textlayoutmanager/platform/ios/TextLayoutManager.h +++ b/ReactCommon/fabric/textlayoutmanager/platform/ios/TextLayoutManager.h @@ -26,7 +26,7 @@ using SharedTextLayoutManager = std::shared_ptr; */ class TextLayoutManager { public: - TextLayoutManager(const SharedContextContainer &contextContainer); + TextLayoutManager(ContextContainer::Shared const &contextContainer); ~TextLayoutManager(); /* diff --git a/ReactCommon/fabric/textlayoutmanager/platform/ios/TextLayoutManager.mm b/ReactCommon/fabric/textlayoutmanager/platform/ios/TextLayoutManager.mm index a900d7b42..55be64985 100644 --- a/ReactCommon/fabric/textlayoutmanager/platform/ios/TextLayoutManager.mm +++ b/ReactCommon/fabric/textlayoutmanager/platform/ios/TextLayoutManager.mm @@ -12,8 +12,8 @@ namespace facebook { namespace react { -TextLayoutManager::TextLayoutManager( - const SharedContextContainer &contextContainer) { +TextLayoutManager::TextLayoutManager(ContextContainer::Shared const &contextContainer) +{ self_ = (__bridge_retained void *)[RCTTextLayoutManager new]; } diff --git a/ReactCommon/fabric/uimanager/ComponentDescriptorFactory.h b/ReactCommon/fabric/uimanager/ComponentDescriptorFactory.h index 2188b9f41..38a82483e 100644 --- a/ReactCommon/fabric/uimanager/ComponentDescriptorFactory.h +++ b/ReactCommon/fabric/uimanager/ComponentDescriptorFactory.h @@ -25,8 +25,8 @@ namespace react { */ using ComponentRegistryFactory = std::function; + EventDispatcher::Shared const &eventDispatcher, + ContextContainer::Shared const &contextContainer)>; ComponentRegistryFactory getDefaultComponentRegistryFactory(); diff --git a/ReactCommon/fabric/uimanager/Scheduler.cpp b/ReactCommon/fabric/uimanager/Scheduler.cpp index 728bedcfa..c12719c52 100644 --- a/ReactCommon/fabric/uimanager/Scheduler.cpp +++ b/ReactCommon/fabric/uimanager/Scheduler.cpp @@ -20,7 +20,7 @@ namespace facebook { namespace react { Scheduler::Scheduler( - const SharedContextContainer &contextContainer, + ContextContainer::Shared const &contextContainer, ComponentRegistryFactory buildRegistryFunction) { const auto asynchronousEventBeatFactory = contextContainer->getInstance("asynchronous"); diff --git a/ReactCommon/fabric/uimanager/Scheduler.h b/ReactCommon/fabric/uimanager/Scheduler.h index 297c963b1..358e5999c 100644 --- a/ReactCommon/fabric/uimanager/Scheduler.h +++ b/ReactCommon/fabric/uimanager/Scheduler.h @@ -32,7 +32,7 @@ namespace react { class Scheduler final : public UIManagerDelegate, public ShadowTreeDelegate { public: Scheduler( - const SharedContextContainer &contextContainer, + ContextContainer::Shared const &contextContainer, ComponentRegistryFactory buildRegistryFunction); ~Scheduler(); diff --git a/ReactCommon/fabric/uimanager/tests/UITemplateProcessorTest.cpp b/ReactCommon/fabric/uimanager/tests/UITemplateProcessorTest.cpp index 49c1e7056..27bb387df 100644 --- a/ReactCommon/fabric/uimanager/tests/UITemplateProcessorTest.cpp +++ b/ReactCommon/fabric/uimanager/tests/UITemplateProcessorTest.cpp @@ -7,6 +7,7 @@ #include +#include #include #include #include @@ -31,7 +32,7 @@ namespace react { // TODO (T29441913): Codegen this app-specific implementation. ComponentRegistryFactory getDefaultComponentRegistryFactory() { return [](const EventDispatcher::Shared &eventDispatcher, - const SharedContextContainer &contextContainer) { + const ContextContainer::Shared &contextContainer) { auto registry = std::make_shared(); registry->registerComponentDescriptor( std::make_shared(eventDispatcher)); diff --git a/ReactCommon/utils/ContextContainer.h b/ReactCommon/utils/ContextContainer.h index fc1c6b17d..8cda40669 100644 --- a/ReactCommon/utils/ContextContainer.h +++ b/ReactCommon/utils/ContextContainer.h @@ -8,24 +8,21 @@ #include #include #include -#include -#include +#include +#include +#include namespace facebook { namespace react { -class ContextContainer; - -using SharedContextContainer = std::shared_ptr; - /* * General purpose dependecy injection container. * Instance types must be copyable. */ class ContextContainer final { public: - using Shared = std::shared_ptr; + using Shared = std::shared_ptr; /* * Registers an instance of the particular type `T` in the container @@ -38,14 +35,13 @@ class ContextContainer final { *`EmptyReactNativeConfig`. */ template - void registerInstance(T const &instance, std::string const &key) { - std::lock_guard lock(mutex_); + void registerInstance(T const &instance, std::string const &key) const { + std::unique_lock lock(mutex_); - auto res = instances_.insert({key, std::make_shared(instance)}); - if (res.second == false) { - LOG(FATAL) << "ContextContainer already had instance for key '" << key - << "'"; - } + assert( + instances_.find(key) == instances_.end() && + "ContextContainer already had instance for given key."); + instances_.insert({key, std::make_shared(instance)}); } /* @@ -54,15 +50,18 @@ class ContextContainer final { */ template T getInstance(std::string const &key) const { - std::lock_guard lock(mutex_); + std::shared_lock lock(mutex_); + assert( + instances_.find(key) != instances_.end() && + "ContextContainer doesn't have an instance for given key."); return *std::static_pointer_cast(instances_.at(key)); } private: - std::unordered_map> instances_; - - mutable std::mutex mutex_; + mutable better::shared_mutex mutex_; + // Protected by mutex_`. + mutable better::map> instances_; }; } // namespace react