From 1f0d48a0e4ed65fe952a87e8e77f22f11f4dcd00 Mon Sep 17 00:00:00 2001 From: Tadeu Zagallo Date: Sat, 7 Nov 2015 13:46:35 -0800 Subject: [PATCH] Guard from hooking modules twice Summary: public The dev menu is a little bit flaky right now, and sometimes it emits messages twice, so guard it not to hook into the modules twice. Reviewed By: jspahrsummers Differential Revision: D2625911 fb-gh-sync-id: 18fd6bc00e473ed226291e7aca4a02cec84bfc8f --- React/Profiler/RCTProfile.m | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/React/Profiler/RCTProfile.m b/React/Profiler/RCTProfile.m index aa1940936..a48b0093d 100644 --- a/React/Profiler/RCTProfile.m +++ b/React/Profiler/RCTProfile.m @@ -38,7 +38,10 @@ NSString *const RCTProfilePrefix = @"rct_profile_"; #pragma mark - Variables +// This is actually a BOOL - but has to be compatible with OSAtomic static volatile uint32_t RCTProfileProfiling; + +static BOOL RCTProfileHookedModules; static NSDictionary *RCTProfileInfo; static NSMutableDictionary *RCTProfileOngoingEvents; static NSTimeInterval RCTProfileStartTime; @@ -200,11 +203,13 @@ void RCTProfileHookModules(RCTBridge *bridge) { #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-pointer-compare" - if (RCTProfileTrampoline == NULL) { + if (RCTProfileTrampoline == NULL || RCTProfileHookedModules) { return; } #pragma clang diagnostic pop + RCTProfileHookedModules = YES; + for (RCTModuleData *moduleData in [bridge valueForKey:@"moduleDataByID"]) { [moduleData dispatchBlock:^{ Class moduleClass = moduleData.moduleClass; @@ -243,6 +248,12 @@ void RCTProfileHookModules(RCTBridge *bridge) void RCTProfileUnhookModules(RCTBridge *bridge) { + if (!RCTProfileHookedModules) { + return; + } + + RCTProfileHookedModules = NO; + dispatch_group_enter(RCTProfileGetUnhookGroup()); for (RCTModuleData *moduleData in [bridge valueForKey:@"moduleDataByID"]) {