mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
ddc4225dd4
Summary: ## Context A while ago, we introduced a new initialization API in NativeModules via RCTInitializing.h (diff: D28435078 (https://github.com/facebook/react-native/commit/9b45df1fced066f40034b0a58be6f4caafd5f785)). ## Problem A number of our NativeModules still use setModuleRegistry to perform initialization. ## Changes This diff migrates those NativeModules to instead use the initialize API. ## Motivation In bridgeless mode each NativeModule object is [created and decorated by the RCTInstance](https://www.internalfb.com/code/fbsource/[89f6c0df78e453a20555975e06bc46b4e0d2bbe9]/fbobjc/Apps/Internal/Venice/Core/RCTInstance.mm?lines=180-189), while [holding the TurboModuleManagerDelegate mutex](https://www.internalfb.com/code/fbsource/[c50ce2bb3fb078d28e1f9afdef5e8793f1413472]/xplat/js/react-native-github/ReactCommon/react/nativemodule/core/platform/ios/RCTTurboModuleManager.mm?lines=429%2C431). After D30753286, setModuleRegistry will be called in RCTInstance getModuleInstanceForClass, which means that we'll start calling setModuleRegistry while holding the TurboModuleManagerDelegate lock. This leads to a deadlock, because calling setModuleRegistry on RCTDeviceInfo [creates RCTAccessibilityManager](https://www.internalfb.com/code/fbsource/[89f6c0df78e453a20555975e06bc46b4e0d2bbe9]/xplat/js/react-native-github/React/CoreModules/RCTDeviceInfo.mm?lines=50), which tries to acquire the TurboModuleManagerDelegate lock again. The NativeModule initialize method isn't called while holding the TurboModuleManagerDelegate lock. That's why moving all initialization logic to the initialize method mitigates this deadlock hazard. In general, we shouldn't do any sort of initialization inside setters for these bridge/bridgeless APIs. No other NativeModules do initialization outside of initialize. Changelog: [Internal] Reviewed By: sammy-SC Differential Revision: D30754870 fbshipit-source-id: 7c2d50f995cba6f58ee2dfebfabd36f640579bcb
24 lines
908 B
Objective-C
24 lines
908 B
Objective-C
/*
|
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*/
|
|
|
|
#import <React/RCTBridgeModule.h>
|
|
#import <React/RCTEventDispatcherProtocol.h>
|
|
#import <React/RCTEventEmitter.h>
|
|
#import <React/RCTSurfacePresenterStub.h>
|
|
#import <React/RCTUIManager.h>
|
|
#import <React/RCTUIManagerObserverCoordinator.h>
|
|
#import <React/RCTUIManagerUtils.h>
|
|
|
|
#import "RCTValueAnimatedNode.h"
|
|
|
|
// TODO T69437152 @petetheheat - Delete this fork when Fabric ships to 100%.
|
|
// NOTE: This module is temporarily forked (see RCTNativeAnimatedModule).
|
|
// When making any changes, be sure to apply them to the fork as well.
|
|
@interface RCTNativeAnimatedTurboModule: RCTEventEmitter <RCTBridgeModule, RCTValueAnimatedNodeObserver, RCTEventDispatcherObserver, RCTUIManagerObserver, RCTSurfacePresenterObserver>
|
|
|
|
@end
|