ObjC: Always dispatch async in UIApplication status observer.
Fixes a possible deadlock.
BUG=webrtc:8130
Review-Url: https://codereview.webrtc.org/3003633002
Cr-Original-Commit-Position: refs/heads/master@{#19464}
Cr-Mirrored-From: https://chromium.googlesource.com/external/webrtc
Cr-Mirrored-Commit: cca0006e33c106a7f62df1a1b50f84676cc5ed1e
diff --git a/sdk/objc/Framework/Classes/Common/RTCUIApplicationStatusObserver.m b/sdk/objc/Framework/Classes/Common/RTCUIApplicationStatusObserver.m
index 718aeca..c598a0e 100644
--- a/sdk/objc/Framework/Classes/Common/RTCUIApplicationStatusObserver.m
+++ b/sdk/objc/Framework/Classes/Common/RTCUIApplicationStatusObserver.m
@@ -14,7 +14,11 @@
#import <UIKit/UIKit.h>
+#include "webrtc/rtc_base/checks.h"
+
@implementation RTCUIApplicationStatusObserver {
+ BOOL _initialized;
+ dispatch_block_t _initializeBlock;
UIApplicationState _state;
}
@@ -45,21 +49,24 @@
_state = [UIApplication sharedApplication].applicationState;
}];
- dispatch_block_t initializeBlock = ^{
+ _initialized = NO;
+ _initializeBlock = dispatch_block_create(DISPATCH_BLOCK_INHERIT_QOS_CLASS, ^{
_state = [UIApplication sharedApplication].applicationState;
- };
+ _initialized = YES;
+ });
- if ([NSThread isMainThread]) {
- initializeBlock();
- } else {
- dispatch_sync(dispatch_get_main_queue(), initializeBlock);
- }
+ dispatch_async(dispatch_get_main_queue(), _initializeBlock);
}
return self;
}
- (BOOL)isApplicationActive {
+ if (!_initialized) {
+ long ret =
+ dispatch_block_wait(_initializeBlock, dispatch_time(DISPATCH_TIME_NOW, 1.0 * NSEC_PER_SEC));
+ RTC_CHECK_EQ(ret, 0);
+ }
return _state == UIApplicationStateActive;
}