diff --git a/packages/react-native/ReactCommon/react/renderer/componentregistry/ComponentDescriptorProviderRegistry.cpp b/packages/react-native/ReactCommon/react/renderer/componentregistry/ComponentDescriptorProviderRegistry.cpp index 0a949f0fb081ce..5afdf8471f33e7 100644 --- a/packages/react-native/ReactCommon/react/renderer/componentregistry/ComponentDescriptorProviderRegistry.cpp +++ b/packages/react-native/ReactCommon/react/renderer/componentregistry/ComponentDescriptorProviderRegistry.cpp @@ -71,10 +71,19 @@ ComponentDescriptorProviderRegistry::createComponentDescriptorRegistry( auto registry = std::make_shared( parameters, *this, parameters.contextContainer); + // for (const auto& pair : componentDescriptorProviders_) { + // registry->add(pair.second); + // } + + std::vector providers; + providers.reserve(componentDescriptorProviders_.size()); for (const auto& pair : componentDescriptorProviders_) { - registry->add(pair.second); + providers.push_back(pair.second); } + // 2) enqueue async add + registry->addMultipleAsync(std::move(providers)); + componentDescriptorRegistries_.push_back(registry); return registry; diff --git a/packages/react-native/ReactCommon/react/renderer/componentregistry/ComponentDescriptorRegistry.cpp b/packages/react-native/ReactCommon/react/renderer/componentregistry/ComponentDescriptorRegistry.cpp index 3c5487b240de68..29d6da109f6fca 100644 --- a/packages/react-native/ReactCommon/react/renderer/componentregistry/ComponentDescriptorRegistry.cpp +++ b/packages/react-native/ReactCommon/react/renderer/componentregistry/ComponentDescriptorRegistry.cpp @@ -16,6 +16,8 @@ #include #include #include +#include + namespace facebook::react { @@ -27,6 +29,35 @@ ComponentDescriptorRegistry::ComponentDescriptorRegistry( providerRegistry_(providerRegistry), contextContainer_(std::move(contextContainer)) {} +void ComponentDescriptorRegistry::addMultipleAsync( + std::vector providers) const { + // Copy everything we need before the thread starts + auto parametersCopy = parameters_; + auto contextContainerCopy = contextContainer_; + + // Start thread immediately + std::thread([this, providers = std::move(providers), parametersCopy, contextContainerCopy]() { + facebook::jni::Environment::ensureCurrentThreadIsAttached(); + std::unique_lock lock(mutex_); + + for (const auto& provider : providers) { + auto componentDescriptor = provider.constructor( + {parametersCopy.eventDispatcher, + contextContainerCopy, + provider.flavor}); + + react_native_assert(componentDescriptor->getComponentHandle() == provider.handle); + react_native_assert(componentDescriptor->getComponentName() == provider.name); + + auto sharedComponentDescriptor = + std::shared_ptr(std::move(componentDescriptor)); + + _registryByHandle[provider.handle] = sharedComponentDescriptor; + _registryByName[provider.name] = sharedComponentDescriptor; + } + }).detach(); +} + void ComponentDescriptorRegistry::add( ComponentDescriptorProvider componentDescriptorProvider) const { std::unique_lock lock(mutex_); diff --git a/packages/react-native/ReactCommon/react/renderer/componentregistry/ComponentDescriptorRegistry.h b/packages/react-native/ReactCommon/react/renderer/componentregistry/ComponentDescriptorRegistry.h index 20bce41f2dcf47..44c564fe76f929 100644 --- a/packages/react-native/ReactCommon/react/renderer/componentregistry/ComponentDescriptorRegistry.h +++ b/packages/react-native/ReactCommon/react/renderer/componentregistry/ComponentDescriptorRegistry.h @@ -15,6 +15,7 @@ #include #include #include +#include namespace facebook::react { @@ -40,6 +41,8 @@ class ComponentDescriptorRegistry { const ComponentDescriptorProviderRegistry& providerRegistry, ContextContainer::Shared contextContainer); + void addMultipleAsync(std::vector providers) const; + /* * This is broken. Please do not use. * If you requesting a ComponentDescriptor and unsure that it's there, you are