Work around race condition in bridge deallocation

Reviewed By: tadeuzagallo, nicklockwood

Differential Revision: D2748820

fb-gh-sync-id: 40084ab4bcc606ccbde8b71c2389e602c4dd8e22
This commit is contained in:
Justin Spahr-Summers 2015-12-11 01:42:17 -08:00 committed by facebook-github-bot-4
parent ae912a83d7
commit 44cbec28bd
1 changed files with 19 additions and 11 deletions

View File

@ -36,7 +36,11 @@ NSString *const RCTDidCreateNativeModules = @"RCTDidCreateNativeModules";
@interface RCTBridge ()
@property (nonatomic, strong) RCTBatchedBridge *batchedBridge;
// This property is mostly used on the main thread, but may be touched from
// a background thread if the RCTBridge happens to deallocate on a background
// thread. Therefore, we want all writes to it to be seen atomically.
@property (atomic, strong) RCTBatchedBridge *batchedBridge;
@property (nonatomic, copy, readonly) RCTBridgeModuleProviderBlock moduleProvider;
@end
@ -232,12 +236,12 @@ RCT_NOT_IMPLEMENTED(- (instancetype)init)
- (NSArray<Class> *)moduleClasses
{
return _batchedBridge.moduleClasses;
return self.batchedBridge.moduleClasses;
}
- (id)moduleForName:(NSString *)moduleName
{
return [_batchedBridge moduleForName:moduleName];
return [self.batchedBridge moduleForName:moduleName];
}
- (id)moduleForClass:(Class)moduleClass
@ -270,30 +274,34 @@ RCT_NOT_IMPLEMENTED(- (instancetype)init)
// Sanitize the bundle URL
_bundleURL = [RCTConvert NSURL:_bundleURL.absoluteString];
_batchedBridge = [[RCTBatchedBridge alloc] initWithParentBridge:self];
self.batchedBridge = [[RCTBatchedBridge alloc] initWithParentBridge:self];
}
- (BOOL)isLoading
{
return _batchedBridge.loading;
return self.batchedBridge.loading;
}
- (BOOL)isValid
{
return _batchedBridge.valid;
return self.batchedBridge.valid;
}
- (void)invalidate
{
RCTAssertMainThread();
RCTBatchedBridge *batchedBridge = self.batchedBridge;
self.batchedBridge = nil;
[_batchedBridge invalidate];
_batchedBridge = nil;
if (batchedBridge) {
RCTExecuteOnMainThread(^{
[batchedBridge invalidate];
}, NO);
}
}
- (void)logMessage:(NSString *)message level:(NSString *)level
{
[_batchedBridge logMessage:message level:level];
[self.batchedBridge logMessage:message level:level];
}
@ -321,7 +329,7 @@ RCT_NOT_IMPLEMENTED(- (instancetype)init)
- (NSDictionary *)modules
{
return _batchedBridge.modules;
return self.batchedBridge.modules;
}
@end