make RCTFBSystrace actually work

Reviewed By: tadeuzagallo

Differential Revision: D3234824

fbshipit-source-id: 9f2f7efd6877fe7b9096dedecb311d226eae7bc8
This commit is contained in:
Marc Horowitz 2016-05-13 17:14:59 -07:00 committed by Facebook Github Bot 8
parent 418e16f711
commit 86e18ace94
9 changed files with 59 additions and 59 deletions

View File

@ -664,7 +664,7 @@ RCT_NOT_IMPLEMENTED(- (instancetype)initWithBundleURL:(__unused NSURL *)bundleUR
* AnyThread * AnyThread
*/ */
RCT_PROFILE_BEGIN_EVENT(0, @"-[RCTBatchedBridge enqueueJSCall:]", nil); RCT_PROFILE_BEGIN_EVENT(RCTProfileTagAlways, @"-[RCTBatchedBridge enqueueJSCall:]", nil);
NSArray<NSString *> *ids = [moduleDotMethod componentsSeparatedByString:@"."]; NSArray<NSString *> *ids = [moduleDotMethod componentsSeparatedByString:@"."];
@ -692,7 +692,7 @@ RCT_NOT_IMPLEMENTED(- (instancetype)initWithBundleURL:(__unused NSURL *)bundleUR
} }
}]; }];
RCT_PROFILE_END_EVENT(0, @"", nil); RCT_PROFILE_END_EVENT(RCTProfileTagAlways, @"", nil);
} }
/** /**
@ -762,10 +762,10 @@ RCT_NOT_IMPLEMENTED(- (instancetype)initWithBundleURL:(__unused NSURL *)bundleUR
return; return;
} }
RCT_PROFILE_BEGIN_EVENT(0, @"FetchApplicationScriptCallbacks", nil); RCT_PROFILE_BEGIN_EVENT(RCTProfileTagAlways, @"FetchApplicationScriptCallbacks", nil);
[_javaScriptExecutor flushedQueue:^(id json, NSError *error) [_javaScriptExecutor flushedQueue:^(id json, NSError *error)
{ {
RCT_PROFILE_END_EVENT(0, @"js_call,init", @{ RCT_PROFILE_END_EVENT(RCTProfileTagAlways, @"js_call,init", @{
@"json": RCTNullIfNil(json), @"json": RCTNullIfNil(json),
@"error": RCTNullIfNil(error), @"error": RCTNullIfNil(error),
}); });
@ -889,7 +889,7 @@ RCT_NOT_IMPLEMENTED(- (instancetype)initWithBundleURL:(__unused NSURL *)bundleUR
dispatch_block_t block = ^{ dispatch_block_t block = ^{
RCTProfileEndFlowEvent(); RCTProfileEndFlowEvent();
RCT_PROFILE_BEGIN_EVENT(0, @"-[RCTBatchedBridge handleBuffer:]", nil); RCT_PROFILE_BEGIN_EVENT(RCTProfileTagAlways, @"-[RCTBatchedBridge handleBuffer:]", nil);
NSOrderedSet *calls = [buckets objectForKey:queue]; NSOrderedSet *calls = [buckets objectForKey:queue];
@autoreleasepool { @autoreleasepool {
@ -909,7 +909,7 @@ RCT_NOT_IMPLEMENTED(- (instancetype)initWithBundleURL:(__unused NSURL *)bundleUR
} }
} }
RCT_PROFILE_END_EVENT(0, @"objc_call,dispatch_async", @{ RCT_PROFILE_END_EVENT(RCTProfileTagAlways, @"objc_call,dispatch_async", @{
@"calls": @(calls.count), @"calls": @(calls.count),
}); });
}; };

View File

@ -97,7 +97,7 @@
{ {
[self assertOnRunLoop]; [self assertOnRunLoop];
RCT_PROFILE_BEGIN_EVENT(0, @"-[RCTDisplayLink _jsThreadUpdate:]", nil); RCT_PROFILE_BEGIN_EVENT(RCTProfileTagAlways, @"-[RCTDisplayLink _jsThreadUpdate:]", nil);
RCTFrameUpdate *frameUpdate = [[RCTFrameUpdate alloc] initWithDisplayLink:displayLink]; RCTFrameUpdate *frameUpdate = [[RCTFrameUpdate alloc] initWithDisplayLink:displayLink];
for (RCTModuleData *moduleData in _frameUpdateObservers) { for (RCTModuleData *moduleData in _frameUpdateObservers) {
@ -114,9 +114,9 @@
[self updateJSDisplayLinkState]; [self updateJSDisplayLinkState];
RCTProfileImmediateEvent(0, @"JS Thread Tick", displayLink.timestamp, 'g'); RCTProfileImmediateEvent(RCTProfileTagAlways, @"JS Thread Tick", displayLink.timestamp, 'g');
RCT_PROFILE_END_EVENT(0, @"objc_call", nil); RCT_PROFILE_END_EVENT(RCTProfileTagAlways, @"objc_call", nil);
} }
- (void)updateJSDisplayLinkState - (void)updateJSDisplayLinkState

View File

@ -187,7 +187,7 @@ RCT_NOT_IMPLEMENTED(- (instancetype)init);
- (id<RCTBridgeModule>)instance - (id<RCTBridgeModule>)instance
{ {
if (!_setupComplete) { if (!_setupComplete) {
RCT_PROFILE_BEGIN_EVENT(0, [NSString stringWithFormat:@"[RCTModuleData instanceForClass:%@]", _moduleClass], nil); RCT_PROFILE_BEGIN_EVENT(RCTProfileTagAlways, [NSString stringWithFormat:@"[RCTModuleData instanceForClass:%@]", _moduleClass], nil);
if (_requiresMainThreadSetup) { if (_requiresMainThreadSetup) {
// The chances of deadlock here are low, because module init very rarely // The chances of deadlock here are low, because module init very rarely
// calls out to other threads, however we can't control when a module might // calls out to other threads, however we can't control when a module might
@ -199,7 +199,7 @@ RCT_NOT_IMPLEMENTED(- (instancetype)init);
} else { } else {
[self setUpInstanceAndBridge]; [self setUpInstanceAndBridge];
} }
RCT_PROFILE_END_EVENT(0, @"", nil); RCT_PROFILE_END_EVENT(RCTProfileTagAlways, @"", nil);
} }
return _instance; return _instance;
} }

View File

@ -21,7 +21,7 @@ void RCTPerformanceLoggerStart(RCTPLTag tag)
{ {
if (RCTProfileIsProfiling()) { if (RCTProfileIsProfiling()) {
NSString *label = RCTPerformanceLoggerLabels()[tag]; NSString *label = RCTPerformanceLoggerLabels()[tag];
RCTPLCookies[tag] = RCTProfileBeginAsyncEvent(0, label, nil); RCTPLCookies[tag] = RCTProfileBeginAsyncEvent(RCTProfileTagAlways, label, nil);
} }
RCTPLData[tag][0] = CACurrentMediaTime() * 1000; RCTPLData[tag][0] = CACurrentMediaTime() * 1000;
@ -35,7 +35,7 @@ void RCTPerformanceLoggerEnd(RCTPLTag tag)
if (RCTProfileIsProfiling()) { if (RCTProfileIsProfiling()) {
NSString *label = RCTPerformanceLoggerLabels()[tag]; NSString *label = RCTPerformanceLoggerLabels()[tag];
RCTProfileEndAsyncEvent(0, @"native", RCTPLCookies[tag], label, @"RCTPerformanceLogger", nil); RCTProfileEndAsyncEvent(RCTProfileTagAlways, @"native", RCTPLCookies[tag], label, @"RCTPerformanceLogger", nil);
} }
} else { } else {
RCTLogInfo(@"Unbalanced calls start/end for tag %li", (unsigned long)tag); RCTLogInfo(@"Unbalanced calls start/end for tag %li", (unsigned long)tag);

View File

@ -62,7 +62,7 @@ NSString *const RCTContentDidAppearNotification = @"RCTContentDidAppearNotificat
RCTAssert(bridge, @"A bridge instance is required to create an RCTRootView"); RCTAssert(bridge, @"A bridge instance is required to create an RCTRootView");
RCTAssert(moduleName, @"A moduleName is required to create an RCTRootView"); RCTAssert(moduleName, @"A moduleName is required to create an RCTRootView");
RCT_PROFILE_BEGIN_EVENT(0, @"-[RCTRootView init]", nil); RCT_PROFILE_BEGIN_EVENT(RCTProfileTagAlways, @"-[RCTRootView init]", nil);
if ((self = [super initWithFrame:CGRectZero])) { if ((self = [super initWithFrame:CGRectZero])) {
@ -98,7 +98,7 @@ NSString *const RCTContentDidAppearNotification = @"RCTContentDidAppearNotificat
[self showLoadingView]; [self showLoadingView];
} }
RCT_PROFILE_END_EVENT(0, @"", nil); RCT_PROFILE_END_EVENT(RCTProfileTagAlways, @"", nil);
return self; return self;
} }

View File

@ -322,10 +322,10 @@ static void RCTInstallJSCProfiler(RCTBridge *bridge, JSContextRef context)
return nil; return nil;
} }
RCT_PROFILE_BEGIN_EVENT(0, @"nativeRequireModuleConfig", nil); RCT_PROFILE_BEGIN_EVENT(RCTProfileTagAlways, @"nativeRequireModuleConfig", nil);
NSArray *config = [strongSelf->_bridge configForModuleName:moduleName]; NSArray *config = [strongSelf->_bridge configForModuleName:moduleName];
NSString *result = config ? RCTJSONStringify(config, NULL) : nil; NSString *result = config ? RCTJSONStringify(config, NULL) : nil;
RCT_PROFILE_END_EVENT(0, @"js_call,config", @{ @"moduleName": moduleName }); RCT_PROFILE_END_EVENT(RCTProfileTagAlways, @"js_call,config", @{ @"moduleName": moduleName });
return result; return result;
}]; }];
@ -335,9 +335,9 @@ static void RCTInstallJSCProfiler(RCTBridge *bridge, JSContextRef context)
return; return;
} }
RCT_PROFILE_BEGIN_EVENT(0, @"nativeFlushQueueImmediate", nil); RCT_PROFILE_BEGIN_EVENT(RCTProfileTagAlways, @"nativeFlushQueueImmediate", nil);
[strongSelf->_bridge handleBuffer:calls batchEnded:NO]; [strongSelf->_bridge handleBuffer:calls batchEnded:NO];
RCT_PROFILE_END_EVENT(0, @"js_call", nil); RCT_PROFILE_END_EVENT(RCTProfileTagAlways, @"js_call", nil);
}]; }];
[self addSynchronousHookWithName:@"nativePerformanceNow" usingBlock:^{ [self addSynchronousHookWithName:@"nativePerformanceNow" usingBlock:^{
@ -736,7 +736,8 @@ static int readBundle(FILE *fd, size_t offset, size_t length, void *ptr)
RCTPerformanceLoggerAdd(RCTPLRAMNativeRequiresCount, 1); RCTPerformanceLoggerAdd(RCTPLRAMNativeRequiresCount, 1);
RCTPerformanceLoggerAppendStart(RCTPLRAMNativeRequires); RCTPerformanceLoggerAppendStart(RCTPLRAMNativeRequires);
RCT_PROFILE_BEGIN_EVENT(0, [@"nativeRequire_" stringByAppendingString:moduleName], nil); RCT_PROFILE_BEGIN_EVENT(RCTProfileTagAlways,
[@"nativeRequire_" stringByAppendingString:moduleName], nil);
ModuleData *data = (ModuleData *)CFDictionaryGetValue(strongSelf->_jsModules, moduleName.UTF8String); ModuleData *data = (ModuleData *)CFDictionaryGetValue(strongSelf->_jsModules, moduleName.UTF8String);
RCTPerformanceLoggerAdd(RCTPLRAMNativeRequiresSize, data->length); RCTPerformanceLoggerAdd(RCTPLRAMNativeRequiresSize, data->length);
@ -756,7 +757,7 @@ static int readBundle(FILE *fd, size_t offset, size_t length, void *ptr)
JSStringRelease(code); JSStringRelease(code);
JSStringRelease(sourceURL); JSStringRelease(sourceURL);
RCT_PROFILE_END_EVENT(0, @"js_call", nil); RCT_PROFILE_END_EVENT(RCTProfileTagAlways, @"js_call", nil);
RCTPerformanceLoggerAppendEnd(RCTPLRAMNativeRequires); RCTPerformanceLoggerAppendEnd(RCTPLRAMNativeRequires);
if (!result) { if (!result) {

View File

@ -1114,7 +1114,7 @@ RCT_EXPORT_METHOD(dispatchViewManagerCommand:(nonnull NSNumber *)reactTag
RCTProfileBeginFlowEvent(); RCTProfileBeginFlowEvent();
dispatch_async(dispatch_get_main_queue(), ^{ dispatch_async(dispatch_get_main_queue(), ^{
RCTProfileEndFlowEvent(); RCTProfileEndFlowEvent();
RCT_PROFILE_BEGIN_EVENT(0, @"-[UIManager flushUIBlocks]", nil); RCT_PROFILE_BEGIN_EVENT(RCTProfileTagAlways, @"-[UIManager flushUIBlocks]", nil);
@try { @try {
for (dispatch_block_t block in previousPendingUIBlocks) { for (dispatch_block_t block in previousPendingUIBlocks) {
block(); block();
@ -1123,7 +1123,7 @@ RCT_EXPORT_METHOD(dispatchViewManagerCommand:(nonnull NSNumber *)reactTag
@catch (NSException *exception) { @catch (NSException *exception) {
RCTLogError(@"Exception thrown while executing UI block: %@", exception); RCTLogError(@"Exception thrown while executing UI block: %@", exception);
} }
RCT_PROFILE_END_EVENT(0, @"objc_call", @{ RCT_PROFILE_END_EVENT(RCTProfileTagAlways, @"objc_call", @{
@"count": @(previousPendingUIBlocks.count), @"count": @(previousPendingUIBlocks.count),
}); });
}); });

View File

@ -24,6 +24,8 @@
RCT_EXTERN NSString *const RCTProfileDidStartProfiling; RCT_EXTERN NSString *const RCTProfileDidStartProfiling;
RCT_EXTERN NSString *const RCTProfileDidEndProfiling; RCT_EXTERN NSString *const RCTProfileDidEndProfiling;
RCT_EXTERN const uint64_t RCTProfileTagAlways;
#if RCT_DEV #if RCT_DEV
@class RCTBridge; @class RCTBridge;
@ -72,9 +74,7 @@ RCT_EXTERN void _RCTProfileBeginEvent(NSThread *calleeThread,
if (RCTProfileIsProfiling()) { \ if (RCTProfileIsProfiling()) { \
NSThread *__calleeThread = [NSThread currentThread]; \ NSThread *__calleeThread = [NSThread currentThread]; \
NSTimeInterval __time = CACurrentMediaTime(); \ NSTimeInterval __time = CACurrentMediaTime(); \
dispatch_async(RCTProfileGetQueue(), ^{ \ _RCTProfileBeginEvent(__calleeThread, __time, __VA_ARGS__); \
_RCTProfileBeginEvent(__calleeThread, __time, __VA_ARGS__); \
}); \
} \ } \
} while(0) } while(0)
@ -96,9 +96,7 @@ RCT_EXTERN void _RCTProfileEndEvent(NSThread *calleeThread,
NSThread *__calleeThread = [NSThread currentThread]; \ NSThread *__calleeThread = [NSThread currentThread]; \
NSString *__threadName = RCTCurrentThreadName(); \ NSString *__threadName = RCTCurrentThreadName(); \
NSTimeInterval __time = CACurrentMediaTime(); \ NSTimeInterval __time = CACurrentMediaTime(); \
dispatch_async(RCTProfileGetQueue(), ^{ \ _RCTProfileEndEvent(__calleeThread, __threadName, __time, __VA_ARGS__); \
_RCTProfileEndEvent(__calleeThread, __threadName, __time, __VA_ARGS__); \
}); \
} \ } \
} while(0) } while(0)

View File

@ -32,6 +32,8 @@
NSString *const RCTProfileDidStartProfiling = @"RCTProfileDidStartProfiling"; NSString *const RCTProfileDidStartProfiling = @"RCTProfileDidStartProfiling";
NSString *const RCTProfileDidEndProfiling = @"RCTProfileDidEndProfiling"; NSString *const RCTProfileDidEndProfiling = @"RCTProfileDidEndProfiling";
const uint64_t RCTProfileTagAlways = 1L << 0;
#if RCT_DEV #if RCT_DEV
#pragma mark - Constants #pragma mark - Constants
@ -205,13 +207,13 @@ void RCTProfileTrampolineStart(id self, SEL cmd)
* block. * block.
*/ */
Class klass = [self class]; Class klass = [self class];
RCT_PROFILE_BEGIN_EVENT(0, [NSString stringWithFormat:@"-[%s %s]", class_getName(klass), sel_getName(cmd)], nil); RCT_PROFILE_BEGIN_EVENT(RCTProfileTagAlways, [NSString stringWithFormat:@"-[%s %s]", class_getName(klass), sel_getName(cmd)], nil);
} }
RCT_EXTERN void RCTProfileTrampolineEnd(void); RCT_EXTERN void RCTProfileTrampolineEnd(void);
void RCTProfileTrampolineEnd(void) void RCTProfileTrampolineEnd(void)
{ {
RCT_PROFILE_END_EVENT(0, @"objc_call,modules,auto", nil); RCT_PROFILE_END_EVENT(RCTProfileTagAlways, @"objc_call,modules,auto", nil);
} }
static UIView *(*originalCreateView)(RCTComponentData *, SEL, NSNumber *); static UIView *(*originalCreateView)(RCTComponentData *, SEL, NSNumber *);
@ -370,7 +372,7 @@ void RCTProfileUnhookModules(RCTBridge *bridge)
+ (void)vsync:(CADisplayLink *)displayLink + (void)vsync:(CADisplayLink *)displayLink
{ {
RCTProfileImmediateEvent(0, @"VSYNC", displayLink.timestamp, 'g'); RCTProfileImmediateEvent(RCTProfileTagAlways, @"VSYNC", displayLink.timestamp, 'g');
} }
+ (void)reload + (void)reload
@ -543,22 +545,21 @@ void _RCTProfileBeginEvent(
NSString *name, NSString *name,
NSDictionary *args NSDictionary *args
) { ) {
CHECK(); CHECK();
RCTAssertThread(RCTProfileGetQueue(), @"Must be called RCTProfile queue");;
if (callbacks != NULL) { if (callbacks != NULL) {
callbacks->begin_section(tag, name.UTF8String, args.count, RCTProfileSystraceArgsFromNSDictionary(args)); callbacks->begin_section(tag, name.UTF8String, args.count, RCTProfileSystraceArgsFromNSDictionary(args));
return; return;
} }
NSMutableArray *events = RCTProfileGetThreadEvents(calleeThread); dispatch_async(RCTProfileGetQueue(), ^{
[events addObject:@[ NSMutableArray *events = RCTProfileGetThreadEvents(calleeThread);
RCTProfileTimestamp(time), [events addObject:@[
name, RCTProfileTimestamp(time),
RCTNullIfNil(args), name,
]]; RCTNullIfNil(args),
]];
});
} }
void _RCTProfileEndEvent( void _RCTProfileEndEvent(
@ -571,32 +572,32 @@ void _RCTProfileEndEvent(
) { ) {
CHECK(); CHECK();
RCTAssertThread(RCTProfileGetQueue(), @"Must be called RCTProfile queue");;
if (callbacks != NULL) { if (callbacks != NULL) {
callbacks->end_section(tag, args.count, RCTProfileSystraceArgsFromNSDictionary(args)); callbacks->end_section(tag, args.count, RCTProfileSystraceArgsFromNSDictionary(args));
return; return;
} }
NSMutableArray<NSArray *> *events = RCTProfileGetThreadEvents(calleeThread); dispatch_async(RCTProfileGetQueue(), ^{
NSArray *event = events.lastObject; NSMutableArray<NSArray *> *events = RCTProfileGetThreadEvents(calleeThread);
[events removeLastObject]; NSArray *event = events.lastObject;
[events removeLastObject];
if (!event) { if (!event) {
return; return;
} }
NSNumber *start = event[0]; NSNumber *start = event[0];
RCTProfileAddEvent(RCTProfileTraceEvents, RCTProfileAddEvent(RCTProfileTraceEvents,
@"tid": threadName, @"tid": threadName,
@"name": event[1], @"name": event[1],
@"cat": category, @"cat": category,
@"ph": @"X", @"ph": @"X",
@"ts": start, @"ts": start,
@"dur": @(RCTProfileTimestamp(time).doubleValue - start.doubleValue), @"dur": @(RCTProfileTimestamp(time).doubleValue - start.doubleValue),
@"args": RCTProfileMergeArgs(event[2], args), @"args": RCTProfileMergeArgs(event[2], args),
); );
});
} }
NSUInteger RCTProfileBeginAsyncEvent( NSUInteger RCTProfileBeginAsyncEvent(