Skip to content

Commit df5d2c6

Browse files
authored
Remove the double dispatch code from the pre-warm detection. (#9528)
1 parent c1a33a0 commit df5d2c6

File tree

4 files changed

+5
-114
lines changed

4 files changed

+5
-114
lines changed

FirebasePerformance/CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
# Pending
2+
* Remove the unused code for pre-warm detection.
3+
14
# Version 8.14.0
25
* [fixed] Record the request payload size for POST/PUT requests.
36

FirebasePerformance/Sources/AppActivity/FPRAppActivityTracker.m

Lines changed: 1 addition & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@
4343
NSString *const kFPRAppCounterNameNetworkTraceEventsRateLimited = @"_fsntc";
4444
NSString *const kFPRAppCounterNameTraceNotStopped = @"_tsns";
4545
NSString *const kFPRAppCounterNameActivePrewarm = @"_fsapc";
46-
NSString *const kFPRAppCounterNameDoubleDispatch = @"_fsddc";
4746

4847
@interface FPRAppActivityTracker ()
4948

@@ -76,16 +75,6 @@ + (void)load {
7675
// This is an approximation of the app start time.
7776
appStartTime = [NSDate date];
7877

79-
// Double dispatch is used to detect prewarming, but if it causes hang or crash in the future
80-
// developers can disable it by setting a plist flag "fireperf_disable_dd" to true
81-
if ([[[NSBundle mainBundle] objectForInfoDictionaryKey:@"fireperf_disable_dd"] boolValue] == NO) {
82-
dispatch_async(dispatch_get_main_queue(), ^{
83-
dispatch_async(dispatch_get_main_queue(), ^{
84-
doubleDispatchTime = [NSDate date];
85-
});
86-
});
87-
}
88-
8978
// When an app is prewarmed, Apple sets env variable ActivePrewarm to 1, then the env variable is
9079
// deleted after didFinishLaunching
9180
isActivePrewarm = [NSProcessInfo.processInfo.environment[@"ActivePrewarm"] isEqualToString:@"1"];
@@ -185,17 +174,7 @@ - (BOOL)isAppStartEnabled {
185174
*/
186175
- (BOOL)isActivePrewarmEnabled {
187176
PrewarmDetectionMode mode = [self.configurations prewarmDetectionMode];
188-
return (mode == PrewarmDetectionModeActivePrewarm ||
189-
mode == PrewarmDetectionModeActivePrewarmOrDoubleDispatch);
190-
}
191-
192-
/**
193-
RC flag for enabling prewarm-detection using double dispatch method
194-
*/
195-
- (BOOL)isDoubleDispatchEnabled {
196-
PrewarmDetectionMode mode = [self.configurations prewarmDetectionMode];
197-
return (mode == PrewarmDetectionModeDoubleDispatch ||
198-
mode == PrewarmDetectionModeActivePrewarmOrDoubleDispatch);
177+
return (mode == PrewarmDetectionModeActivePrewarm);
199178
}
200179

201180
/**
@@ -215,13 +194,6 @@ - (BOOL)isApplicationPreWarmed {
215194
[self.activeTrace incrementMetric:kFPRAppCounterNameActivePrewarm byInt:0];
216195
}
217196

218-
if ([doubleDispatchTime compare:applicationDidFinishLaunchTime] == NSOrderedAscending) {
219-
isPrewarmed = isPrewarmed || [self isDoubleDispatchEnabled];
220-
[self.activeTrace incrementMetric:kFPRAppCounterNameDoubleDispatch byInt:1];
221-
} else if (doubleDispatchTime) {
222-
[self.activeTrace incrementMetric:kFPRAppCounterNameDoubleDispatch byInt:0];
223-
}
224-
225197
return isPrewarmed;
226198
}
227199

FirebasePerformance/Sources/Configurations/FPRConfigurations.h

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,12 @@ NS_ASSUME_NONNULL_BEGIN
2020
* Different modes of prewarm-detection
2121
* KeepNone = No app start events are allowed
2222
* ActivePrewarm = Only detect prewarming using ActivePrewarm environment
23-
* DoubleDispatch = Only detect prewarming using double dispatch method
24-
* ActivePrewarmOrDoubleDispatch = Detect prewarming using both ActivePrewarm and double dispatch
2523
* KeepAll = All app start events are allowed
2624
*/
2725
typedef NS_ENUM(NSInteger, PrewarmDetectionMode) {
2826
PrewarmDetectionModeKeepNone = 0,
2927
PrewarmDetectionModeActivePrewarm = 1,
30-
PrewarmDetectionModeDoubleDispatch = 2,
31-
PrewarmDetectionModeActivePrewarmOrDoubleDispatch = 3,
32-
PrewarmDetectionModeKeepAll = 4
28+
PrewarmDetectionModeKeepAll = 2
3329
};
3430

3531
/** A typedef for ensuring that config names are one of the below specified strings. */

FirebasePerformance/Tests/Unit/FPRAppActivityTrackerTest.m

Lines changed: 0 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -205,28 +205,11 @@ - (void)testApplicationStateManagement {
205205
XCTAssertEqual(appTracker.applicationState, FPRApplicationStateBackground);
206206
}
207207

208-
/** Validates double dispatch returns true when +load occurs before didFinishLaunching
209-
*/
210-
- (void)test_isApplicationPrewarmed_doubleDispatch_returnsYes {
211-
id mockAppTracker = OCMPartialMock([FPRAppActivityTracker sharedInstance]);
212-
OCMStub([mockAppTracker isPrewarmAvailable]).andReturn(YES);
213-
OCMStub([mockAppTracker isDoubleDispatchEnabled]).andReturn(YES);
214-
OCMStub([mockAppTracker isActivePrewarmEnabled]).andReturn(NO);
215-
216-
[FPRAppActivityTracker load];
217-
[[NSNotificationCenter defaultCenter]
218-
postNotificationName:UIApplicationDidFinishLaunchingNotification
219-
object:[UIApplication sharedApplication]];
220-
221-
XCTAssertTrue([mockAppTracker isApplicationPreWarmed]);
222-
}
223-
224208
/** Validates ActivePrewarm environment variable set to true is detected by prewarm-detection
225209
*/
226210
- (void)test_isApplicationPrewarmed_activePrewarm_returnsYes {
227211
id mockAppTracker = OCMPartialMock([FPRAppActivityTracker sharedInstance]);
228212
OCMStub([mockAppTracker isPrewarmAvailable]).andReturn(YES);
229-
OCMStub([mockAppTracker isDoubleDispatchEnabled]).andReturn(NO);
230213
OCMStub([mockAppTracker isActivePrewarmEnabled]).andReturn(YES);
231214

232215
setenv("ActivePrewarm", "1", 1);
@@ -239,7 +222,6 @@ - (void)test_isApplicationPrewarmed_activePrewarm_returnsYes {
239222
- (void)test_isApplicationPrewarmed_activePrewarm_returnsNo {
240223
id mockAppTracker = OCMPartialMock([FPRAppActivityTracker sharedInstance]);
241224
OCMStub([mockAppTracker isPrewarmAvailable]).andReturn(YES);
242-
OCMStub([mockAppTracker isDoubleDispatchEnabled]).andReturn(NO);
243225
OCMStub([mockAppTracker isActivePrewarmEnabled]).andReturn(YES);
244226

245227
XCTAssertFalse([mockAppTracker isApplicationPreWarmed]);
@@ -281,66 +263,4 @@ - (void)test_isActivePrewarmEnabled_PrewarmDetectionModeActivePrewarm_returnsYes
281263
XCTAssertTrue([appTracker isActivePrewarmEnabled]);
282264
}
283265

284-
/** Validates ActivePrewarm filtering is disabled when RC flag fpr_prewarm_detection is
285-
* PrewarmDetectionModeDoubleDispatch
286-
*/
287-
- (void)test_isActivePrewarmEnabled_PrewarmDetectionModeDoubleDispatch_returnsNo {
288-
FPRAppActivityTracker *appTracker = [FPRAppActivityTracker sharedInstance];
289-
id mockConfigurations = OCMClassMock([FPRConfigurations class]);
290-
appTracker.configurations = mockConfigurations;
291-
292-
OCMStub([mockConfigurations prewarmDetectionMode]).andReturn(PrewarmDetectionModeDoubleDispatch);
293-
XCTAssertFalse([appTracker isActivePrewarmEnabled]);
294-
}
295-
296-
/** Validates double dispatch filtering is disabled when RC flag fpr_prewarm_detection is
297-
* PrewarmDetectionModeActivePrewarm
298-
*/
299-
- (void)test_isDoubleDispatchEnabled_PrewarmDetectionModeActivePrewarm_returnsNo {
300-
FPRAppActivityTracker *appTracker = [FPRAppActivityTracker sharedInstance];
301-
id mockConfigurations = OCMClassMock([FPRConfigurations class]);
302-
appTracker.configurations = mockConfigurations;
303-
304-
OCMStub([mockConfigurations prewarmDetectionMode]).andReturn(PrewarmDetectionModeActivePrewarm);
305-
XCTAssertFalse([appTracker isDoubleDispatchEnabled]);
306-
}
307-
308-
/** Validates double dispatch filtering is enabled when RC flag fpr_prewarm_detection is
309-
* PrewarmDetectionModeDoubleDispatch
310-
*/
311-
- (void)test_isDoubleDispatchEnabled_PrewarmDetectionModeDoubleDispatch_returnsYes {
312-
FPRAppActivityTracker *appTracker = [FPRAppActivityTracker sharedInstance];
313-
id mockConfigurations = OCMClassMock([FPRConfigurations class]);
314-
appTracker.configurations = mockConfigurations;
315-
316-
OCMStub([mockConfigurations prewarmDetectionMode]).andReturn(PrewarmDetectionModeDoubleDispatch);
317-
XCTAssertTrue([appTracker isDoubleDispatchEnabled]);
318-
}
319-
320-
/** Validates ActivePrewarm filtering is enabled when RC flag fpr_prewarm_detection is
321-
* PrewarmDetectionModeActivePrewarmOrDoubleDispatch
322-
*/
323-
- (void)test_isActivePrewarmEnabled_PrewarmDetectionModeActivePrewarmOrDoubleDispatch_returnsYes {
324-
FPRAppActivityTracker *appTracker = [FPRAppActivityTracker sharedInstance];
325-
id mockConfigurations = OCMClassMock([FPRConfigurations class]);
326-
appTracker.configurations = mockConfigurations;
327-
328-
OCMStub([mockConfigurations prewarmDetectionMode])
329-
.andReturn(PrewarmDetectionModeActivePrewarmOrDoubleDispatch);
330-
XCTAssertTrue([appTracker isActivePrewarmEnabled]);
331-
}
332-
333-
/** Validates double dispatch filtering is enabled when RC flag fpr_prewarm_detection is
334-
* PrewarmDetectionModeActivePrewarmOrDoubleDispatch
335-
*/
336-
- (void)test_isDoubleDispatchEnabled_PrewarmDetectionModeActivePrewarmOrDoubleDispatch_returnsYes {
337-
FPRAppActivityTracker *appTracker = [FPRAppActivityTracker sharedInstance];
338-
id mockConfigurations = OCMClassMock([FPRConfigurations class]);
339-
appTracker.configurations = mockConfigurations;
340-
341-
OCMStub([mockConfigurations prewarmDetectionMode])
342-
.andReturn(PrewarmDetectionModeActivePrewarmOrDoubleDispatch);
343-
XCTAssertTrue([appTracker isDoubleDispatchEnabled]);
344-
}
345-
346266
@end

0 commit comments

Comments
 (0)