Instrument module create
Summary: `RCTModuleData instance` is the entry-point for creating and initializing NativeModules on iOS. This diff instruments module-create for the legacy NativeModule system. Changelog: [Internal] Reviewed By: PeteTheHeat Differential Revision: D21415435 fbshipit-source-id: 8554e41cba9105ef528a9a63c49042b99ebf8751
This commit is contained in:
Родитель
0b7bcd36ef
Коммит
c3783b5da6
|
@ -8,7 +8,10 @@
|
|||
#import "RCTModuleData.h"
|
||||
|
||||
#import <objc/runtime.h>
|
||||
#include <mutex>
|
||||
#import <atomic>
|
||||
#import <mutex>
|
||||
|
||||
#import <ReactCommon/NativeModulePerfLogger.h>
|
||||
|
||||
#import "RCTBridge+Private.h"
|
||||
#import "RCTBridge.h"
|
||||
|
@ -17,6 +20,16 @@
|
|||
#import "RCTProfile.h"
|
||||
#import "RCTUtils.h"
|
||||
|
||||
using namespace facebook::react;
|
||||
|
||||
namespace {
|
||||
int32_t getUniqueId()
|
||||
{
|
||||
static std::atomic<int32_t> counter{0};
|
||||
return counter++;
|
||||
}
|
||||
}
|
||||
|
||||
@implementation RCTModuleData {
|
||||
NSDictionary<NSString *, id> *_constantsToExport;
|
||||
NSString *_queueName;
|
||||
|
@ -110,22 +123,29 @@ RCT_NOT_IMPLEMENTED(-(instancetype)init);
|
|||
|
||||
#pragma mark - private setup methods
|
||||
|
||||
- (void)setUpInstanceAndBridge
|
||||
- (void)setUpInstanceAndBridge:(int32_t)requestId
|
||||
{
|
||||
NSString *moduleName = [self name];
|
||||
|
||||
RCT_PROFILE_BEGIN_EVENT(
|
||||
RCTProfileTagAlways,
|
||||
@"[RCTModuleData setUpInstanceAndBridge]",
|
||||
@{@"moduleClass" : NSStringFromClass(_moduleClass)});
|
||||
{
|
||||
std::unique_lock<std::mutex> lock(_instanceLock);
|
||||
BOOL shouldSetup = !_setupComplete && _bridge.valid;
|
||||
|
||||
if (!_setupComplete && _bridge.valid) {
|
||||
if (shouldSetup) {
|
||||
if (!_instance) {
|
||||
if (RCT_DEBUG && _requiresMainQueueSetup) {
|
||||
RCTAssertMainQueue();
|
||||
}
|
||||
RCT_PROFILE_BEGIN_EVENT(RCTProfileTagAlways, @"[RCTModuleData setUpInstanceAndBridge] Create module", nil);
|
||||
|
||||
NativeModulePerfLogger::getInstance().moduleCreateConstructStart([moduleName UTF8String], requestId);
|
||||
_instance = _moduleProvider ? _moduleProvider() : nil;
|
||||
NativeModulePerfLogger::getInstance().moduleCreateConstructEnd([moduleName UTF8String], requestId);
|
||||
|
||||
RCT_PROFILE_END_EVENT(RCTProfileTagAlways, @"");
|
||||
if (!_instance) {
|
||||
// Module init returned nil, probably because automatic instantiation
|
||||
|
@ -143,7 +163,13 @@ RCT_NOT_IMPLEMENTED(-(instancetype)init);
|
|||
if (_instance && RCTProfileIsProfiling()) {
|
||||
RCTProfileHookInstance(_instance);
|
||||
}
|
||||
}
|
||||
|
||||
if (_instance) {
|
||||
NativeModulePerfLogger::getInstance().moduleCreateSetUpStart([moduleName UTF8String], requestId);
|
||||
}
|
||||
|
||||
if (shouldSetup) {
|
||||
// Bridge must be set before methodQueue is set up, as methodQueue
|
||||
// initialization requires it (View Managers get their queue by calling
|
||||
// self.bridge.uiManager.methodQueue)
|
||||
|
@ -171,6 +197,10 @@ RCT_NOT_IMPLEMENTED(-(instancetype)init);
|
|||
// thread.
|
||||
_requiresMainQueueSetup = NO;
|
||||
}
|
||||
|
||||
if (_instance) {
|
||||
NativeModulePerfLogger::getInstance().moduleCreateSetUpEnd([moduleName UTF8String], requestId);
|
||||
}
|
||||
}
|
||||
|
||||
- (void)setBridgeForInstance
|
||||
|
@ -286,6 +316,10 @@ RCT_NOT_IMPLEMENTED(-(instancetype)init);
|
|||
|
||||
- (id<RCTBridgeModule>)instance
|
||||
{
|
||||
NSString *moduleName = [self name];
|
||||
int32_t requestId = getUniqueId();
|
||||
NativeModulePerfLogger::getInstance().moduleCreateStart([moduleName UTF8String], requestId);
|
||||
|
||||
if (!_setupComplete) {
|
||||
RCT_PROFILE_BEGIN_EVENT(
|
||||
RCTProfileTagAlways, ([NSString stringWithFormat:@"[RCTModuleData instanceForClass:%@]", _moduleClass]), nil);
|
||||
|
@ -301,13 +335,21 @@ RCT_NOT_IMPLEMENTED(-(instancetype)init);
|
|||
}
|
||||
|
||||
RCTUnsafeExecuteOnMainQueueSync(^{
|
||||
[self setUpInstanceAndBridge];
|
||||
[self setUpInstanceAndBridge:requestId];
|
||||
});
|
||||
RCT_PROFILE_END_EVENT(RCTProfileTagAlways, @"");
|
||||
} else {
|
||||
[self setUpInstanceAndBridge];
|
||||
[self setUpInstanceAndBridge:requestId];
|
||||
}
|
||||
RCT_PROFILE_END_EVENT(RCTProfileTagAlways, @"");
|
||||
} else {
|
||||
NativeModulePerfLogger::getInstance().moduleCreateCacheHit([moduleName UTF8String], requestId);
|
||||
}
|
||||
|
||||
if (_instance) {
|
||||
NativeModulePerfLogger::getInstance().moduleCreateEnd([moduleName UTF8String], requestId);
|
||||
} else {
|
||||
NativeModulePerfLogger::getInstance().moduleCreateFail([moduleName UTF8String], requestId);
|
||||
}
|
||||
return _instance;
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче