@@ -48,8 +48,6 @@ void ComponentDescriptorRegistry::addMultipleAsync(
4848 facebook::jni::Environment::ensureCurrentThreadIsAttached ();
4949 #endif
5050
51- std::unique_lock lock (self->mutex_ );
52-
5351 for (const auto & provider : providers) {
5452 auto componentDescriptor = provider.constructor (
5553 {parametersCopy.eventDispatcher ,
@@ -62,6 +60,9 @@ void ComponentDescriptorRegistry::addMultipleAsync(
6260 auto sharedComponentDescriptor =
6361 std::shared_ptr<const ComponentDescriptor>(std::move (componentDescriptor));
6462
63+ // Only lock when inserting into the maps
64+ // The componentDescriptor constructor might calls into this ComponentDescriptorRegistry::at(), so we want to avoid deadlocks
65+ std::unique_lock lock (self->mutex_ );
6566 self->_registryByHandle [provider.handle ] = sharedComponentDescriptor;
6667 self->_registryByName [provider.name ] = sharedComponentDescriptor;
6768 }
@@ -92,8 +93,6 @@ void ComponentDescriptorRegistry::add(
9293
9394void ComponentDescriptorRegistry::registerComponentDescriptor (
9495 const SharedComponentDescriptor& componentDescriptor) const {
95- std::unique_lock lock (mutex_);
96-
9796 ComponentHandle componentHandle = componentDescriptor->getComponentHandle ();
9897 _registryByHandle[componentHandle] = componentDescriptor;
9998
@@ -126,9 +125,12 @@ const ComponentDescriptor& ComponentDescriptorRegistry::at(
126125 }
127126
128127 if (it == _registryByName.end ()) {
128+ lock.unlock ();
129129 auto componentDescriptor = std::make_shared<
130130 const UnstableLegacyViewManagerAutomaticComponentDescriptor>(
131131 parameters_, unifiedComponentName);
132+
133+ std::unique_lock writeLock (mutex_);
132134 registerComponentDescriptor (componentDescriptor);
133135 return *_registryByName.find (unifiedComponentName)->second ;
134136 }
@@ -166,6 +168,7 @@ bool ComponentDescriptorRegistry::hasComponentDescriptorAt(
166168
167169void ComponentDescriptorRegistry::setFallbackComponentDescriptor (
168170 const SharedComponentDescriptor& descriptor) {
171+ std::unique_lock lock (mutex_);
169172 _fallbackComponentDescriptor = descriptor;
170173 registerComponentDescriptor (descriptor);
171174}
0 commit comments