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:
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user