Skip to content

Commit

Permalink
Back out "Fix race condition in native module invalidation" (#44523)
Browse files Browse the repository at this point in the history
Summary:
Pull Request resolved: #44523

This is a revert of #44048
The original change has introduced some regression in native module invalidation stability.

Changelog: [Internal]

Reviewed By: cipolleschi

Differential Revision: D57207598

fbshipit-source-id: eb967102351434c652cb9d6f9935cbf9952d7328
  • Loading branch information
dmytrorykun authored and facebook-github-bot committed May 13, 2024
1 parent a37111a commit 6a75662
Showing 1 changed file with 14 additions and 28 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -180,11 +180,6 @@ 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 @@ -1045,7 +1040,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 @@ -1068,31 +1063,22 @@ - (void)_invalidateModules
[module class]);
continue;
}
modulesToInvalidate.push_back({module, methodQueue});
}
}

for (auto unused : modulesToInvalidate) {
dispatch_group_enter(moduleInvalidationGroup);
}

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);
};
dispatch_group_enter(moduleInvalidationGroup);
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();
if (_bridge) {
[_bridge dispatchBlock:invalidateModule queue:methodQueue];
} else {
dispatch_async(methodQueue, invalidateModule);
// Bridgeless mode
if (methodQueue == RCTJSThread) {
invalidateModule();
} else {
dispatch_async(methodQueue, invalidateModule);
}
}
}
}
Expand Down

0 comments on commit 6a75662

Please sign in to comment.