@@ -39,13 +39,16 @@ void ComponentDescriptorRegistry::addMultipleAsync(
3939 auto parametersCopy = parameters_;
4040 auto contextContainerCopy = contextContainer_;
4141
42- // Start thread immediately
43- std::thread ([this , providers = std::move (providers), parametersCopy, contextContainerCopy]() {
42+ auto self = shared_from_this ();
43+
44+ // Start detached thread - registry stays alive until completion due to strong self reference
45+ std::thread ([self, providers = std::move (providers), parametersCopy, contextContainerCopy]() {
4446 // Ensure this C++ thread is attached to the JVM before touching JNI
4547 #ifdef __ANDROID__
4648 facebook::jni::Environment::ensureCurrentThreadIsAttached ();
4749 #endif
48- std::unique_lock lock (mutex_);
50+
51+ std::unique_lock lock (self->mutex_ );
4952
5053 for (const auto & provider : providers) {
5154 auto componentDescriptor = provider.constructor (
@@ -59,8 +62,8 @@ void ComponentDescriptorRegistry::addMultipleAsync(
5962 auto sharedComponentDescriptor =
6063 std::shared_ptr<const ComponentDescriptor>(std::move (componentDescriptor));
6164
62- _registryByHandle[provider.handle ] = sharedComponentDescriptor;
63- _registryByName[provider.name ] = sharedComponentDescriptor;
65+ self-> _registryByHandle [provider.handle ] = sharedComponentDescriptor;
66+ self-> _registryByName [provider.name ] = sharedComponentDescriptor;
6467 }
6568 }).detach ();
6669}
@@ -89,6 +92,8 @@ void ComponentDescriptorRegistry::add(
8992
9093void ComponentDescriptorRegistry::registerComponentDescriptor (
9194 const SharedComponentDescriptor& componentDescriptor) const {
95+ std::unique_lock lock (mutex_);
96+
9297 ComponentHandle componentHandle = componentDescriptor->getComponentHandle ();
9398 _registryByHandle[componentHandle] = componentDescriptor;
9499
0 commit comments