From cca0006e33c106a7f62df1a1b50f84676cc5ed1e Mon Sep 17 00:00:00 2001 From: andersc Date: Wed, 23 Aug 2017 06:04:17 -0700 Subject: [PATCH] ObjC: Always dispatch async in UIApplication status observer. Fixes a possible deadlock. BUG=webrtc:8130 Review-Url: https://codereview.webrtc.org/3003633002 Cr-Commit-Position: refs/heads/master@{#19464} --- .../Common/RTCUIApplicationStatusObserver.m | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/webrtc/sdk/objc/Framework/Classes/Common/RTCUIApplicationStatusObserver.m b/webrtc/sdk/objc/Framework/Classes/Common/RTCUIApplicationStatusObserver.m index 718aeca58b..c598a0e56c 100644 --- a/webrtc/sdk/objc/Framework/Classes/Common/RTCUIApplicationStatusObserver.m +++ b/webrtc/sdk/objc/Framework/Classes/Common/RTCUIApplicationStatusObserver.m @@ -14,7 +14,11 @@ #import +#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; }