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}
This commit is contained in:
andersc
2017-08-23 06:04:17 -07:00
committed by Commit Bot
parent a79cc28de1
commit cca0006e33

View File

@ -14,7 +14,11 @@
#import <UIKit/UIKit.h> #import <UIKit/UIKit.h>
#include "webrtc/rtc_base/checks.h"
@implementation RTCUIApplicationStatusObserver { @implementation RTCUIApplicationStatusObserver {
BOOL _initialized;
dispatch_block_t _initializeBlock;
UIApplicationState _state; UIApplicationState _state;
} }
@ -45,21 +49,24 @@
_state = [UIApplication sharedApplication].applicationState; _state = [UIApplication sharedApplication].applicationState;
}]; }];
dispatch_block_t initializeBlock = ^{ _initialized = NO;
_initializeBlock = dispatch_block_create(DISPATCH_BLOCK_INHERIT_QOS_CLASS, ^{
_state = [UIApplication sharedApplication].applicationState; _state = [UIApplication sharedApplication].applicationState;
}; _initialized = YES;
});
if ([NSThread isMainThread]) { dispatch_async(dispatch_get_main_queue(), _initializeBlock);
initializeBlock();
} else {
dispatch_sync(dispatch_get_main_queue(), initializeBlock);
}
} }
return self; return self;
} }
- (BOOL)isApplicationActive { - (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; return _state == UIApplicationStateActive;
} }