Skip to content

Commit 6c9c858

Browse files
committed
fix(android): fix deadlock in component registry
Adds to: 33cd751
1 parent 588befa commit 6c9c858

File tree

1 file changed

+7
-4
lines changed

1 file changed

+7
-4
lines changed

packages/react-native/ReactCommon/react/renderer/componentregistry/ComponentDescriptorRegistry.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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

9394
void 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

167169
void ComponentDescriptorRegistry::setFallbackComponentDescriptor(
168170
const SharedComponentDescriptor& descriptor) {
171+
std::unique_lock lock(mutex_);
169172
_fallbackComponentDescriptor = descriptor;
170173
registerComponentDescriptor(descriptor);
171174
}

0 commit comments

Comments
 (0)