Source/TNLTimeoutOperation.m (66 lines of code) (raw):
//
// TNLTimeoutOperation.m
// TwitterNetworkLayer
//
// Created on 12/7/17.
// Copyright © 2020 Twitter. All rights reserved.
//
#include <stdatomic.h>
#import "TNL_Project.h"
#import "TNLTimeoutOperation.h"
NS_ASSUME_NONNULL_BEGIN
@implementation TNLTimeoutOperation
{
volatile atomic_bool _executingFlag;
volatile atomic_bool _finishedFlag;
}
- (instancetype)initWithTimeoutDuration:(NSTimeInterval)timeout
{
if (self = [super init]) {
_timeoutDuration = timeout;
atomic_init(&_finishedFlag, false);
atomic_init(&_executingFlag, false);
}
return self;
}
- (BOOL)isExecuting
{
return atomic_load(&_executingFlag);
}
- (BOOL)isFinished
{
return atomic_load(&_finishedFlag);
}
- (BOOL)isConcurrent
{
return YES;
}
- (BOOL)isAsynchronous
{
return YES;
}
- (void)start
{
if (self.isCancelled) {
[self willChangeValueForKey:@"isFinished"];
atomic_store(&_finishedFlag, true);
[self didChangeValueForKey:@"isFinished"];
return;
}
[self willChangeValueForKey:@"isExecuting"];
atomic_store(&_executingFlag, true);
[self didChangeValueForKey:@"isExecuting"];
if (_timeoutDuration > 0.0) {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(_timeoutDuration * NSEC_PER_SEC)), dispatch_get_global_queue(QOS_CLASS_DEFAULT, 0), ^{
@autoreleasepool {
[self _complete];
}
});
} else {
[self _complete];
}
}
- (void)_complete TNL_OBJC_DIRECT
{
[self willChangeValueForKey:@"isFinished"];
[self willChangeValueForKey:@"isExecuting"];
atomic_store(&_executingFlag, false);
atomic_store(&_finishedFlag, true);
[self didChangeValueForKey:@"isExecuting"];
[self didChangeValueForKey:@"isFinished"];
}
@end
NS_ASSUME_NONNULL_END