@@ -40,13 +40,16 @@ void ComponentDescriptorRegistry::addMultipleAsync(
4040 auto parametersCopy = parameters_;
4141 auto contextContainerCopy = contextContainer_;
4242
43- // Start thread immediately
44- std::thread ([this , providers = std::move (providers), parametersCopy, contextContainerCopy]() {
43+ auto self = shared_from_this ();
44+
45+ // Start detached thread - registry stays alive until completion due to strong self reference
46+ std::thread ([self, providers = std::move (providers), parametersCopy, contextContainerCopy]() {
4547 // Ensure this C++ thread is attached to the JVM before touching JNI
4648 #ifdef __ANDROID__
4749 facebook::jni::Environment::ensureCurrentThreadIsAttached ();
4850 #endif
49- std::unique_lock lock (mutex_);
51+
52+ std::unique_lock lock (self->mutex_ );
5053
5154 for (const auto & provider : providers) {
5255 auto componentDescriptor = provider.constructor (
@@ -60,8 +63,8 @@ void ComponentDescriptorRegistry::addMultipleAsync(
6063 auto sharedComponentDescriptor =
6164 std::shared_ptr<const ComponentDescriptor>(std::move (componentDescriptor));
6265
63- _registryByHandle[provider.handle ] = sharedComponentDescriptor;
64- _registryByName[provider.name ] = sharedComponentDescriptor;
66+ self-> _registryByHandle [provider.handle ] = sharedComponentDescriptor;
67+ self-> _registryByName [provider.name ] = sharedComponentDescriptor;
6568 }
6669 }).detach ();
6770}
@@ -90,6 +93,8 @@ void ComponentDescriptorRegistry::add(
9093
9194void ComponentDescriptorRegistry::registerComponentDescriptor (
9295 const SharedComponentDescriptor& componentDescriptor) const {
96+ std::unique_lock lock (mutex_);
97+
9398 ComponentHandle componentHandle = componentDescriptor->getComponentHandle ();
9499 _registryByHandle[componentHandle] = componentDescriptor;
95100
0 commit comments