Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,11 @@ static Class getFallbackClassFromName(const char *name)
return moduleClass;
}

typedef struct {
id<RCTBridgeModule> module;
dispatch_queue_t methodQueue;
} ModuleQueuePair;

@implementation RCTTurboModuleManager {
std::shared_ptr<CallInvoker> _jsInvoker;
__weak id<RCTTurboModuleManagerDelegate> _delegate;
Expand Down Expand Up @@ -1033,7 +1038,7 @@ - (void)_invalidateModules
{
// Backward-compatibility: RCTInvalidating handling.
dispatch_group_t moduleInvalidationGroup = dispatch_group_create();

std::vector<ModuleQueuePair> modulesToInvalidate;
for (auto &pair : _moduleHolders) {
std::string moduleName = pair.first;
ModuleHolder *moduleHolder = &pair.second;
Expand All @@ -1056,22 +1061,31 @@ - (void)_invalidateModules
[module class]);
continue;
}
modulesToInvalidate.push_back({module, methodQueue});
}
}

dispatch_group_enter(moduleInvalidationGroup);
dispatch_block_t invalidateModule = ^{
[((id<RCTInvalidating>)module) invalidate];
dispatch_group_leave(moduleInvalidationGroup);
};
for (auto unused : modulesToInvalidate) {
dispatch_group_enter(moduleInvalidationGroup);
}

if (_bridge) {
[_bridge dispatchBlock:invalidateModule queue:methodQueue];
for (auto &moduleQueuePair : modulesToInvalidate) {
id<RCTBridgeModule> module = moduleQueuePair.module;
dispatch_queue_t methodQueue = moduleQueuePair.methodQueue;

dispatch_block_t invalidateModule = ^{
[((id<RCTInvalidating>)module) invalidate];
dispatch_group_leave(moduleInvalidationGroup);
};

if (_bridge) {
[_bridge dispatchBlock:invalidateModule queue:methodQueue];
} else {
// Bridgeless mode
if (methodQueue == RCTJSThread) {
invalidateModule();
} else {
// Bridgeless mode
if (methodQueue == RCTJSThread) {
invalidateModule();
} else {
dispatch_async(methodQueue, invalidateModule);
}
dispatch_async(methodQueue, invalidateModule);
}
}
}
Expand Down