mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
Some MTSignal fixes
This commit is contained in:
parent
30639d9a88
commit
1b3cfcb124
@ -13,8 +13,13 @@
|
||||
- (instancetype)initWithGenerator:(id<MTDisposable> (^)(MTSubscriber *))generator;
|
||||
|
||||
- (id<MTDisposable>)startWithNext:(void (^)(id next))next error:(void (^)(id error))error completed:(void (^)())completed;
|
||||
- (id<MTDisposable>)startWithNextStrict:(void (^)(id next))next error:(void (^)(id error))error completed:(void (^)())completed file:(const char *)file line:(int)line;
|
||||
|
||||
- (id<MTDisposable>)startWithNext:(void (^)(id next))next;
|
||||
- (id<MTDisposable>)startWithNextStrict:(void (^)(id next))next file:(const char *)file line:(int)line;
|
||||
|
||||
- (id<MTDisposable>)startWithNext:(void (^)(id next))next completed:(void (^)())completed;
|
||||
- (id<MTDisposable>)startWithNextStrict:(void (^)(id next))next completed:(void (^)())completed file:(const char *)file line:(int)line;
|
||||
|
||||
+ (MTSignal *)single:(id)next;
|
||||
+ (MTSignal *)fail:(id)error;
|
||||
|
@ -1030,15 +1030,17 @@ static void copyKeychainDictionaryKey(NSString * _Nonnull group, NSString * _Non
|
||||
__weak MTContext *weakSelf = self;
|
||||
MTMetaDisposable *disposable = [[MTMetaDisposable alloc] init];
|
||||
_fetchPublicKeysActions[@(datacenterId)] = disposable;
|
||||
[disposable setDisposable:[signal startWithNext:^(NSArray<NSDictionary *> *next) {
|
||||
[disposable setDisposable:[signal startWithNextStrict:^(NSArray<NSDictionary *> *next) {
|
||||
[[MTContext contextQueue] dispatchOnQueue:^{
|
||||
__strong MTContext *strongSelf = weakSelf;
|
||||
if (strongSelf != nil) {
|
||||
id<MTDisposable> disposable = strongSelf->_fetchPublicKeysActions[@(datacenterId)];
|
||||
[strongSelf->_fetchPublicKeysActions removeObjectForKey:@(datacenterId)];
|
||||
[disposable dispose];
|
||||
[strongSelf updatePublicKeysForDatacenterWithId:datacenterId publicKeys:next];
|
||||
}
|
||||
} synchronous:false];
|
||||
}]];
|
||||
} file:__FILE_NAME__ line:__LINE__]];
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -1157,10 +1159,12 @@ static void copyKeychainDictionaryKey(NSString * _Nonnull group, NSString * _Non
|
||||
{
|
||||
[[MTContext contextQueue] dispatchOnQueue:^
|
||||
{
|
||||
id<MTDisposable> disposable = strongSelf->_transportSchemeDisposableByDatacenterId[@(datacenterId)];
|
||||
[strongSelf->_transportSchemeDisposableByDatacenterId removeObjectForKey:@(datacenterId)];
|
||||
[disposable dispose];
|
||||
}];
|
||||
}
|
||||
}] startWithNext:^(MTTransportScheme *next)
|
||||
}] startWithNextStrict:^(MTTransportScheme *next)
|
||||
{
|
||||
if (MTLogEnabled()) {
|
||||
MTLog(@"scheme: %@", next);
|
||||
@ -1176,7 +1180,7 @@ static void copyKeychainDictionaryKey(NSString * _Nonnull group, NSString * _Non
|
||||
} completed:^
|
||||
{
|
||||
|
||||
}];
|
||||
} file:__FILE_NAME__ line:__LINE__];
|
||||
}
|
||||
}];
|
||||
}
|
||||
@ -1293,7 +1297,7 @@ static void copyKeychainDictionaryKey(NSString * _Nonnull group, NSString * _Non
|
||||
[strongSelf->_backupAddressListDisposable dispose];
|
||||
strongSelf->_backupAddressListDisposable = nil;
|
||||
}
|
||||
}] startWithNext:nil];
|
||||
}] startWithNextStrict:nil file:__FILE_NAME__ line:__LINE__];
|
||||
}
|
||||
}
|
||||
|
||||
@ -1491,7 +1495,7 @@ static void copyKeychainDictionaryKey(NSString * _Nonnull group, NSString * _Non
|
||||
_datacenterCheckKeyRemovedActionTimestamps[@(datacenterId)] = currentTimestamp;
|
||||
[_datacenterCheckKeyRemovedActions[@(datacenterId)] dispose];
|
||||
__weak MTContext *weakSelf = self;
|
||||
_datacenterCheckKeyRemovedActions[@(datacenterId)] = [[MTDiscoverConnectionSignals checkIfAuthKeyRemovedWithContext:self datacenterId:datacenterId authKey:[[MTDatacenterAuthKey alloc] initWithAuthKey:authInfo.authKey authKeyId:authInfo.authKeyId validUntilTimestamp:authInfo.validUntilTimestamp notBound:false]] startWithNext:^(NSNumber* isRemoved) {
|
||||
_datacenterCheckKeyRemovedActions[@(datacenterId)] = [[MTDiscoverConnectionSignals checkIfAuthKeyRemovedWithContext:self datacenterId:datacenterId authKey:[[MTDatacenterAuthKey alloc] initWithAuthKey:authInfo.authKey authKeyId:authInfo.authKeyId validUntilTimestamp:authInfo.validUntilTimestamp notBound:false]] startWithNextStrict:^(NSNumber* isRemoved) {
|
||||
[[MTContext contextQueue] dispatchOnQueue:^{
|
||||
__strong MTContext *strongSelf = weakSelf;
|
||||
if (strongSelf == nil) {
|
||||
@ -1506,7 +1510,7 @@ static void copyKeychainDictionaryKey(NSString * _Nonnull group, NSString * _Non
|
||||
}
|
||||
}
|
||||
}];
|
||||
}];
|
||||
} file:__FILE_NAME__ line:__LINE__];
|
||||
}
|
||||
}];
|
||||
}
|
||||
|
@ -125,7 +125,7 @@
|
||||
|
||||
if (disposable != nil) {
|
||||
__weak MTDNSContext *weakSelf = self;
|
||||
[disposable setDisposable:[[[self performLookup:host port:port] deliverOn:[MTDNSContext sharedQueue]] startWithNext:^(NSString *result) {
|
||||
[disposable setDisposable:[[[self performLookup:host port:port] deliverOn:[MTDNSContext sharedQueue]] startWithNextStrict:^(NSString *result) {
|
||||
__strong MTDNSContext *strongSelf = weakSelf;
|
||||
if (strongSelf == nil) {
|
||||
return;
|
||||
@ -134,7 +134,7 @@
|
||||
[strongSelf->_contexts[key] complete:result];
|
||||
[strongSelf->_contexts removeObjectForKey:key];
|
||||
}
|
||||
}]];
|
||||
} file:__FILE_NAME__ line:__LINE__]];
|
||||
}
|
||||
|
||||
__weak MTDNSContext *weakSelf = self;
|
||||
|
@ -1,13 +1,11 @@
|
||||
#import <MtProtoKit/MTDisposable.h>
|
||||
|
||||
#import <os/lock.h>
|
||||
#import <libkern/OSAtomic.h>
|
||||
#import <stdatomic.h>
|
||||
#import <pthread/pthread.h>
|
||||
#import <objc/runtime.h>
|
||||
|
||||
@interface MTBlockDisposable ()
|
||||
{
|
||||
void *_block;
|
||||
@interface MTBlockDisposable () {
|
||||
void (^_action)();
|
||||
pthread_mutex_t _lock;
|
||||
}
|
||||
|
||||
@end
|
||||
@ -19,47 +17,35 @@
|
||||
self = [super init];
|
||||
if (self != nil)
|
||||
{
|
||||
_block = (__bridge_retained void *)[block copy];
|
||||
_action = [block copy];
|
||||
pthread_mutex_init(&_lock, nil);
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)dealloc
|
||||
{
|
||||
void *block = _block;
|
||||
if (block != NULL)
|
||||
{
|
||||
#pragma clang diagnostic push
|
||||
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
|
||||
if (OSAtomicCompareAndSwapPtr(block, 0, &_block))
|
||||
{
|
||||
if (block != nil)
|
||||
{
|
||||
__unused __strong id strongBlock = (__bridge_transfer id)block;
|
||||
strongBlock = nil;
|
||||
}
|
||||
}
|
||||
#pragma clang diagnostic pop
|
||||
- (void)dealloc {
|
||||
void (^freeAction)() = nil;
|
||||
pthread_mutex_lock(&_lock);
|
||||
freeAction = _action;
|
||||
_action = nil;
|
||||
pthread_mutex_unlock(&_lock);
|
||||
|
||||
if (freeAction) {
|
||||
}
|
||||
|
||||
pthread_mutex_destroy(&_lock);
|
||||
}
|
||||
|
||||
- (void)dispose
|
||||
{
|
||||
void *block = _block;
|
||||
if (block != NULL)
|
||||
{
|
||||
#pragma clang diagnostic push
|
||||
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
|
||||
if (OSAtomicCompareAndSwapPtr(block, 0, &_block))
|
||||
{
|
||||
if (block != nil)
|
||||
{
|
||||
__strong id strongBlock = (__bridge_transfer id)block;
|
||||
((dispatch_block_t)strongBlock)();
|
||||
strongBlock = nil;
|
||||
}
|
||||
}
|
||||
#pragma clang diagnostic pop
|
||||
- (void)dispose {
|
||||
void (^disposeAction)() = nil;
|
||||
|
||||
pthread_mutex_lock(&_lock);
|
||||
disposeAction = _action;
|
||||
_action = nil;
|
||||
pthread_mutex_unlock(&_lock);
|
||||
|
||||
if (disposeAction) {
|
||||
disposeAction();
|
||||
}
|
||||
}
|
||||
|
||||
@ -67,7 +53,7 @@
|
||||
|
||||
@interface MTMetaDisposable ()
|
||||
{
|
||||
os_unfair_lock _lock;
|
||||
pthread_mutex_t _lock;
|
||||
bool _disposed;
|
||||
id<MTDisposable> _disposable;
|
||||
}
|
||||
@ -76,128 +62,139 @@
|
||||
|
||||
@implementation MTMetaDisposable
|
||||
|
||||
- (void)setDisposable:(id<MTDisposable>)disposable
|
||||
{
|
||||
id<MTDisposable> previousDisposable = nil;
|
||||
bool dispose = false;
|
||||
- (instancetype)init {
|
||||
self = [super init];
|
||||
if (self != nil) {
|
||||
pthread_mutex_init(&_lock, nil);
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
os_unfair_lock_lock(&_lock);
|
||||
dispose = _disposed;
|
||||
if (!dispose)
|
||||
{
|
||||
- (void)dealloc {
|
||||
id<MTDisposable> freeDisposable = nil;
|
||||
pthread_mutex_lock(&_lock);
|
||||
if (_disposable) {
|
||||
freeDisposable = _disposable;
|
||||
_disposable = nil;
|
||||
}
|
||||
pthread_mutex_unlock(&_lock);
|
||||
|
||||
if (freeDisposable) {
|
||||
}
|
||||
|
||||
pthread_mutex_destroy(&_lock);
|
||||
}
|
||||
|
||||
- (void)setDisposable:(id<MTDisposable>)disposable {
|
||||
id<MTDisposable> previousDisposable = nil;
|
||||
bool disposeImmediately = false;
|
||||
|
||||
pthread_mutex_lock(&_lock);
|
||||
disposeImmediately = _disposed;
|
||||
if (!disposeImmediately) {
|
||||
previousDisposable = _disposable;
|
||||
_disposable = disposable;
|
||||
}
|
||||
os_unfair_lock_unlock(&_lock);
|
||||
pthread_mutex_unlock(&_lock);
|
||||
|
||||
if (previousDisposable != nil)
|
||||
if (previousDisposable) {
|
||||
[previousDisposable dispose];
|
||||
}
|
||||
|
||||
if (dispose)
|
||||
if (disposeImmediately) {
|
||||
[disposable dispose];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)dispose
|
||||
{
|
||||
- (void)dispose {
|
||||
id<MTDisposable> disposable = nil;
|
||||
|
||||
os_unfair_lock_lock(&_lock);
|
||||
if (!_disposed)
|
||||
{
|
||||
disposable = _disposable;
|
||||
pthread_mutex_lock(&_lock);
|
||||
if (!_disposed) {
|
||||
_disposed = true;
|
||||
disposable = _disposable;
|
||||
_disposable = nil;
|
||||
}
|
||||
os_unfair_lock_unlock(&_lock);
|
||||
pthread_mutex_unlock(&_lock);
|
||||
|
||||
if (disposable != nil)
|
||||
if (disposable) {
|
||||
[disposable dispose];
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@interface MTDisposableSet ()
|
||||
{
|
||||
os_unfair_lock _lock;
|
||||
pthread_mutex_t _lock;
|
||||
bool _disposed;
|
||||
id<MTDisposable> _singleDisposable;
|
||||
NSArray *_multipleDisposables;
|
||||
NSMutableArray<id<MTDisposable>> *_disposables;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation MTDisposableSet
|
||||
|
||||
- (void)add:(id<MTDisposable>)disposable
|
||||
{
|
||||
if (disposable == nil)
|
||||
return;
|
||||
|
||||
bool dispose = false;
|
||||
|
||||
os_unfair_lock_lock(&_lock);
|
||||
dispose = _disposed;
|
||||
if (!dispose)
|
||||
{
|
||||
if (_multipleDisposables != nil)
|
||||
{
|
||||
NSMutableArray *multipleDisposables = [[NSMutableArray alloc] initWithArray:_multipleDisposables];
|
||||
[multipleDisposables addObject:disposable];
|
||||
_multipleDisposables = multipleDisposables;
|
||||
}
|
||||
else if (_singleDisposable != nil)
|
||||
{
|
||||
NSMutableArray *multipleDisposables = [[NSMutableArray alloc] initWithObjects:_singleDisposable, disposable, nil];
|
||||
_multipleDisposables = multipleDisposables;
|
||||
_singleDisposable = nil;
|
||||
}
|
||||
else
|
||||
{
|
||||
_singleDisposable = disposable;
|
||||
}
|
||||
- (instancetype)init {
|
||||
self = [super init];
|
||||
if (self != nil) {
|
||||
pthread_mutex_init(&_lock, nil);
|
||||
_disposables = [[NSMutableArray alloc] init];
|
||||
}
|
||||
os_unfair_lock_unlock(&_lock);
|
||||
return self;
|
||||
}
|
||||
|
||||
if (dispose)
|
||||
- (void)dealloc {
|
||||
NSArray<id<MTDisposable>> *disposables = nil;
|
||||
pthread_mutex_lock(&_lock);
|
||||
disposables = _disposables;
|
||||
_disposables = nil;
|
||||
pthread_mutex_unlock(&_lock);
|
||||
|
||||
if (disposables) {
|
||||
}
|
||||
pthread_mutex_destroy(&_lock);
|
||||
}
|
||||
|
||||
- (void)add:(id<MTDisposable>)disposable {
|
||||
bool disposeImmediately = false;
|
||||
|
||||
pthread_mutex_lock(&_lock);
|
||||
if (_disposed) {
|
||||
disposeImmediately = true;
|
||||
} else {
|
||||
[_disposables addObject:disposable];
|
||||
}
|
||||
pthread_mutex_unlock(&_lock);
|
||||
|
||||
if (disposeImmediately) {
|
||||
[disposable dispose];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)remove:(id<MTDisposable>)disposable {
|
||||
os_unfair_lock_lock(&_lock);
|
||||
if (_multipleDisposables != nil)
|
||||
{
|
||||
NSMutableArray *multipleDisposables = [[NSMutableArray alloc] initWithArray:_multipleDisposables];
|
||||
[multipleDisposables removeObject:disposable];
|
||||
_multipleDisposables = multipleDisposables;
|
||||
pthread_mutex_lock(&_lock);
|
||||
for (NSInteger i = 0; i < _disposables.count; i++) {
|
||||
if (_disposables[i] == disposable) {
|
||||
[_disposables removeObjectAtIndex:i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (_singleDisposable == disposable)
|
||||
{
|
||||
_singleDisposable = nil;
|
||||
}
|
||||
os_unfair_lock_unlock(&_lock);
|
||||
pthread_mutex_unlock(&_lock);
|
||||
}
|
||||
|
||||
- (void)dispose
|
||||
{
|
||||
id<MTDisposable> singleDisposable = nil;
|
||||
NSArray *multipleDisposables = nil;
|
||||
|
||||
os_unfair_lock_lock(&_lock);
|
||||
if (!_disposed)
|
||||
{
|
||||
- (void)dispose {
|
||||
NSArray<id<MTDisposable>> *disposables = nil;
|
||||
pthread_mutex_lock(&_lock);
|
||||
if (!_disposed) {
|
||||
_disposed = true;
|
||||
singleDisposable = _singleDisposable;
|
||||
multipleDisposables = _multipleDisposables;
|
||||
_singleDisposable = nil;
|
||||
_multipleDisposables = nil;
|
||||
disposables = _disposables;
|
||||
_disposables = nil;
|
||||
}
|
||||
os_unfair_lock_unlock(&_lock);
|
||||
pthread_mutex_unlock(&_lock);
|
||||
|
||||
if (singleDisposable != nil)
|
||||
[singleDisposable dispose];
|
||||
if (multipleDisposables != nil)
|
||||
{
|
||||
for (id<MTDisposable> disposable in multipleDisposables)
|
||||
{
|
||||
if (disposables) {
|
||||
for (id<MTDisposable> disposable in disposables) {
|
||||
[disposable dispose];
|
||||
}
|
||||
}
|
||||
|
@ -838,7 +838,7 @@ static const NSUInteger MTMaxUnacknowledgedMessageCount = 64;
|
||||
__weak MTProto *weakSelf = self;
|
||||
MTSignal *checkSignal = [[MTConnectionProbing probeProxyWithContext:_context datacenterId:_datacenterId settings:transport.proxySettings] delay:5.0 onQueue:[MTQueue concurrentDefaultQueue]];
|
||||
checkSignal = [[checkSignal then:[[MTSignal complete] delay:20.0 onQueue:[MTQueue concurrentDefaultQueue]]] restart];
|
||||
[_probingDisposable setDisposable:[checkSignal startWithNext:^(NSNumber *next) {
|
||||
[_probingDisposable setDisposable:[checkSignal startWithNextStrict:^(NSNumber *next) {
|
||||
[[MTProto managerQueue] dispatchOnQueue:^{
|
||||
__strong MTProto *strongSelf = weakSelf;
|
||||
if (strongSelf == nil) {
|
||||
@ -849,7 +849,7 @@ static const NSUInteger MTMaxUnacknowledgedMessageCount = 64;
|
||||
[strongSelf _updateConnectionIssuesStatus:[strongSelf->_probingStatus boolValue]];
|
||||
}
|
||||
}];
|
||||
}]];
|
||||
} file:__FILE_NAME__ line:__LINE__]];
|
||||
}
|
||||
}
|
||||
}];
|
||||
|
@ -1,6 +1,6 @@
|
||||
#import <MtProtoKit/MTSignal.h>
|
||||
|
||||
#import <os/lock.h>
|
||||
#import <pthread/pthread.h>
|
||||
#import <MtProtoKit/MTTimer.h>
|
||||
#import <MtProtoKit/MTQueue.h>
|
||||
#import <MtProtoKit/MTAtomic.h>
|
||||
@ -8,28 +8,97 @@
|
||||
|
||||
@interface MTSubscriberDisposable : NSObject <MTDisposable>
|
||||
{
|
||||
MTSubscriber *_subscriber;
|
||||
__weak MTSubscriber *_subscriber;
|
||||
id<MTDisposable> _disposable;
|
||||
pthread_mutex_t _lock;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation MTSubscriberDisposable
|
||||
|
||||
- (instancetype)initWithSubscriber:(MTSubscriber *)subscriber disposable:(id<MTDisposable>)disposable
|
||||
{
|
||||
- (instancetype)initWithSubscriber:(MTSubscriber *)subscriber disposable:(id<MTDisposable>)disposable {
|
||||
self = [super init];
|
||||
if (self != nil)
|
||||
{
|
||||
if (self != nil) {
|
||||
_subscriber = subscriber;
|
||||
_disposable = disposable;
|
||||
pthread_mutex_init(&_lock, nil);
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)dispose
|
||||
{
|
||||
[_subscriber _markTerminatedWithoutDisposal];
|
||||
- (void)dealloc {
|
||||
pthread_mutex_destroy(&_lock);
|
||||
}
|
||||
|
||||
- (void)dispose {
|
||||
MTSubscriber *subscriber = nil;
|
||||
id<MTDisposable> disposeItem = nil;
|
||||
pthread_mutex_lock(&_lock);
|
||||
disposeItem = _disposable;
|
||||
_disposable = nil;
|
||||
subscriber = _subscriber;
|
||||
_subscriber = nil;
|
||||
pthread_mutex_unlock(&_lock);
|
||||
|
||||
[disposeItem dispose];
|
||||
[subscriber _markTerminatedWithoutDisposal];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@interface MTStrictDisposable : NSObject<MTDisposable> {
|
||||
id<MTDisposable> _disposable;
|
||||
const char *_file;
|
||||
int _line;
|
||||
|
||||
#if DEBUG
|
||||
pthread_mutex_t _lock;
|
||||
bool _isDisposed;
|
||||
#endif
|
||||
}
|
||||
|
||||
- (instancetype)initWithDisposable:(id<MTDisposable>)disposable file:(const char *)file line:(int)line;
|
||||
- (void)dispose;
|
||||
|
||||
@end
|
||||
|
||||
@implementation MTStrictDisposable
|
||||
|
||||
- (instancetype)initWithDisposable:(id<MTDisposable>)disposable file:(const char *)file line:(int)line {
|
||||
self = [super init];
|
||||
if (self != nil) {
|
||||
_disposable = disposable;
|
||||
_file = file;
|
||||
_line = line;
|
||||
|
||||
#if DEBUG
|
||||
pthread_mutex_init(&_lock, nil);
|
||||
#endif
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)dealloc {
|
||||
#if DEBUG
|
||||
pthread_mutex_lock(&_lock);
|
||||
if (!_isDisposed) {
|
||||
NSLog(@"Leaked disposable from %s:%d", _file, _line);
|
||||
assert(false);
|
||||
}
|
||||
pthread_mutex_unlock(&_lock);
|
||||
|
||||
pthread_mutex_destroy(&_lock);
|
||||
#endif
|
||||
}
|
||||
|
||||
- (void)dispose {
|
||||
#if DEBUG
|
||||
pthread_mutex_lock(&_lock);
|
||||
_isDisposed = true;
|
||||
pthread_mutex_unlock(&_lock);
|
||||
#endif
|
||||
|
||||
[_disposable dispose];
|
||||
}
|
||||
|
||||
@ -55,7 +124,7 @@
|
||||
|
||||
@interface MTSignalQueueState : NSObject <MTDisposable>
|
||||
{
|
||||
os_unfair_lock _lock;
|
||||
pthread_mutex_t _lock;
|
||||
bool _executingSignal;
|
||||
bool _terminated;
|
||||
|
||||
@ -76,6 +145,8 @@
|
||||
self = [super init];
|
||||
if (self != nil)
|
||||
{
|
||||
pthread_mutex_init(&_lock, nil);
|
||||
|
||||
_subscriber = subscriber;
|
||||
_currentDisposable = [[MTMetaDisposable alloc] init];
|
||||
_queuedSignals = queueMode ? [[NSMutableArray alloc] init] : nil;
|
||||
@ -84,6 +155,10 @@
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)dealloc {
|
||||
pthread_mutex_destroy(&_lock);
|
||||
}
|
||||
|
||||
- (void)beginWithDisposable:(id<MTDisposable>)disposable
|
||||
{
|
||||
_disposable = disposable;
|
||||
@ -92,7 +167,7 @@
|
||||
- (void)enqueueSignal:(MTSignal *)signal
|
||||
{
|
||||
bool startSignal = false;
|
||||
os_unfair_lock_lock(&_lock);
|
||||
pthread_mutex_lock(&_lock);
|
||||
if (_queueMode && _executingSignal)
|
||||
{
|
||||
[_queuedSignals addObject:signal];
|
||||
@ -102,7 +177,7 @@
|
||||
_executingSignal = true;
|
||||
startSignal = true;
|
||||
}
|
||||
os_unfair_lock_unlock(&_lock);
|
||||
pthread_mutex_unlock(&_lock);
|
||||
|
||||
if (startSignal)
|
||||
{
|
||||
@ -130,7 +205,7 @@
|
||||
MTSignal *nextSignal = nil;
|
||||
|
||||
bool terminated = false;
|
||||
os_unfair_lock_lock(&_lock);
|
||||
pthread_mutex_lock(&_lock);
|
||||
_executingSignal = false;
|
||||
|
||||
if (_queueMode)
|
||||
@ -146,7 +221,7 @@
|
||||
}
|
||||
else
|
||||
terminated = _terminated;
|
||||
os_unfair_lock_unlock(&_lock);
|
||||
pthread_mutex_unlock(&_lock);
|
||||
|
||||
if (terminated)
|
||||
[_subscriber putCompletion];
|
||||
@ -174,10 +249,10 @@
|
||||
- (void)beginCompletion
|
||||
{
|
||||
bool executingSignal = false;
|
||||
os_unfair_lock_lock(&_lock);
|
||||
pthread_mutex_lock(&_lock);
|
||||
executingSignal = _executingSignal;
|
||||
_terminated = true;
|
||||
os_unfair_lock_unlock(&_lock);
|
||||
pthread_mutex_unlock(&_lock);
|
||||
|
||||
if (!executingSignal)
|
||||
[_subscriber putCompletion];
|
||||
@ -235,6 +310,14 @@
|
||||
return [[MTSubscriberDisposable alloc] initWithSubscriber:subscriber disposable:disposable];
|
||||
}
|
||||
|
||||
- (id<MTDisposable>)startWithNextStrict:(void (^)(id next))next error:(void (^)(id error))error completed:(void (^)())completed file:(const char *)file line:(int)line
|
||||
{
|
||||
MTSubscriber *subscriber = [[MTSubscriber alloc] initWithNext:next error:error completed:completed];
|
||||
id<MTDisposable> disposable = _generator(subscriber);
|
||||
[subscriber _assignDisposable:disposable];
|
||||
return [[MTStrictDisposable alloc] initWithDisposable:[[MTSubscriberDisposable alloc] initWithSubscriber:subscriber disposable:disposable] file:file line:line];
|
||||
}
|
||||
|
||||
- (id<MTDisposable>)startWithNext:(void (^)(id next))next
|
||||
{
|
||||
MTSubscriber *subscriber = [[MTSubscriber alloc] initWithNext:next error:nil completed:nil];
|
||||
@ -243,6 +326,14 @@
|
||||
return [[MTSubscriberDisposable alloc] initWithSubscriber:subscriber disposable:disposable];
|
||||
}
|
||||
|
||||
- (id<MTDisposable>)startWithNextStrict:(void (^)(id next))next file:(const char *)file line:(int)line
|
||||
{
|
||||
MTSubscriber *subscriber = [[MTSubscriber alloc] initWithNext:next error:nil completed:nil];
|
||||
id<MTDisposable> disposable = _generator(subscriber);
|
||||
[subscriber _assignDisposable:disposable];
|
||||
return [[MTStrictDisposable alloc] initWithDisposable:[[MTSubscriberDisposable alloc] initWithSubscriber:subscriber disposable:disposable] file:file line:line];
|
||||
}
|
||||
|
||||
- (id<MTDisposable>)startWithNext:(void (^)(id next))next completed:(void (^)())completed
|
||||
{
|
||||
MTSubscriber *subscriber = [[MTSubscriber alloc] initWithNext:next error:nil completed:completed];
|
||||
@ -251,6 +342,14 @@
|
||||
return [[MTSubscriberDisposable alloc] initWithSubscriber:subscriber disposable:disposable];
|
||||
}
|
||||
|
||||
- (id<MTDisposable>)startWithNextStrict:(void (^)(id next))next completed:(void (^)())completed file:(const char *)file line:(int)line
|
||||
{
|
||||
MTSubscriber *subscriber = [[MTSubscriber alloc] initWithNext:next error:nil completed:completed];
|
||||
id<MTDisposable> disposable = _generator(subscriber);
|
||||
[subscriber _assignDisposable:disposable];
|
||||
return [[MTStrictDisposable alloc] initWithDisposable:[[MTSubscriberDisposable alloc] initWithSubscriber:subscriber disposable:disposable] file:file line:line];
|
||||
}
|
||||
|
||||
+ (MTSignal *)single:(id)next
|
||||
{
|
||||
return [[MTSignal alloc] initWithGenerator:^id<MTDisposable> (MTSubscriber *subscriber)
|
||||
@ -324,11 +423,11 @@
|
||||
{
|
||||
return [[MTSignal alloc] initWithGenerator:^id<MTDisposable> (MTSubscriber *subscriber)
|
||||
{
|
||||
MTMetaDisposable *disposable = [[MTMetaDisposable alloc] init];
|
||||
MTMetaDisposable *startDisposable = [[MTMetaDisposable alloc] init];
|
||||
MTMetaDisposable *timerDisposable = [[MTMetaDisposable alloc] init];
|
||||
|
||||
MTTimer *timer = [[MTTimer alloc] initWithTimeout:seconds repeat:false completion:^
|
||||
{
|
||||
[disposable setDisposable:[self startWithNext:^(id next)
|
||||
MTTimer *timer = [[MTTimer alloc] initWithTimeout:seconds repeat:false completion:^{
|
||||
[startDisposable setDisposable:[self startWithNext:^(id next)
|
||||
{
|
||||
[subscriber putNext:next];
|
||||
} error:^(id error)
|
||||
@ -342,12 +441,15 @@
|
||||
|
||||
[timer start];
|
||||
|
||||
[disposable setDisposable:[[MTBlockDisposable alloc] initWithBlock:^
|
||||
[timerDisposable setDisposable:[[MTBlockDisposable alloc] initWithBlock:^
|
||||
{
|
||||
[timer invalidate];
|
||||
}]];
|
||||
|
||||
return disposable;
|
||||
return [[MTBlockDisposable alloc] initWithBlock:^{
|
||||
[startDisposable dispose];
|
||||
[timerDisposable dispose];
|
||||
}];
|
||||
}];
|
||||
}
|
||||
|
||||
@ -355,11 +457,11 @@
|
||||
{
|
||||
return [[MTSignal alloc] initWithGenerator:^id<MTDisposable> (MTSubscriber *subscriber)
|
||||
{
|
||||
MTMetaDisposable *disposable = [[MTMetaDisposable alloc] init];
|
||||
MTMetaDisposable *startDisposable = [[MTMetaDisposable alloc] init];
|
||||
MTMetaDisposable *timerDisposable = [[MTMetaDisposable alloc] init];
|
||||
|
||||
MTTimer *timer = [[MTTimer alloc] initWithTimeout:seconds repeat:false completion:^
|
||||
{
|
||||
[disposable setDisposable:[signal startWithNext:^(id next)
|
||||
MTTimer *timer = [[MTTimer alloc] initWithTimeout:seconds repeat:false completion:^{
|
||||
[startDisposable setDisposable:[signal startWithNext:^(id next)
|
||||
{
|
||||
[subscriber putNext:next];
|
||||
} error:^(id error)
|
||||
@ -372,7 +474,7 @@
|
||||
} queue:queue.nativeQueue];
|
||||
[timer start];
|
||||
|
||||
[disposable setDisposable:[self startWithNext:^(id next)
|
||||
[timerDisposable setDisposable:[self startWithNext:^(id next)
|
||||
{
|
||||
[timer invalidate];
|
||||
[subscriber putNext:next];
|
||||
@ -386,7 +488,10 @@
|
||||
[subscriber putCompletion];
|
||||
}]];
|
||||
|
||||
return disposable;
|
||||
return [[MTBlockDisposable alloc] initWithBlock:^{
|
||||
[startDisposable dispose];
|
||||
[timerDisposable dispose];
|
||||
}];
|
||||
}];
|
||||
}
|
||||
|
||||
|
@ -68,6 +68,7 @@
|
||||
{
|
||||
os_unfair_lock_lock(&_lock);
|
||||
MTSubscriberBlocks *blocks = nil;
|
||||
id<MTDisposable> disposable = _disposable;
|
||||
if (!_terminated)
|
||||
{
|
||||
blocks = _blocks;
|
||||
@ -80,6 +81,8 @@
|
||||
if (blocks) {
|
||||
blocks = nil;
|
||||
}
|
||||
if (disposable) {
|
||||
}
|
||||
}
|
||||
|
||||
- (void)putNext:(id)next
|
||||
@ -100,6 +103,7 @@
|
||||
- (void)putError:(id)error
|
||||
{
|
||||
bool shouldDispose = false;
|
||||
id<MTDisposable> disposable = nil;
|
||||
MTSubscriberBlocks *blocks = nil;
|
||||
|
||||
os_unfair_lock_lock(&_lock);
|
||||
@ -111,19 +115,23 @@
|
||||
shouldDispose = true;
|
||||
_terminated = true;
|
||||
}
|
||||
disposable = _disposable;
|
||||
_disposable = nil;
|
||||
os_unfair_lock_unlock(&_lock);
|
||||
|
||||
if (blocks && blocks->_error) {
|
||||
blocks->_error(error);
|
||||
}
|
||||
|
||||
if (shouldDispose)
|
||||
[self->_disposable dispose];
|
||||
if (shouldDispose) {
|
||||
[disposable dispose];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)putCompletion
|
||||
{
|
||||
bool shouldDispose = false;
|
||||
id<MTDisposable> disposable = nil;
|
||||
MTSubscriberBlocks *blocks = nil;
|
||||
|
||||
os_unfair_lock_lock(&_lock);
|
||||
@ -135,18 +143,30 @@
|
||||
shouldDispose = true;
|
||||
_terminated = true;
|
||||
}
|
||||
disposable = _disposable;
|
||||
_disposable = nil;
|
||||
os_unfair_lock_unlock(&_lock);
|
||||
|
||||
if (blocks && blocks->_completed)
|
||||
blocks->_completed();
|
||||
|
||||
if (shouldDispose)
|
||||
[self->_disposable dispose];
|
||||
if (shouldDispose) {
|
||||
[disposable dispose];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)dispose
|
||||
{
|
||||
[self->_disposable dispose];
|
||||
id<MTDisposable> disposable = nil;
|
||||
|
||||
os_unfair_lock_lock(&_lock);
|
||||
disposable = _disposable;
|
||||
_disposable = nil;
|
||||
os_unfair_lock_unlock(&_lock);
|
||||
|
||||
if (disposable) {
|
||||
[disposable dispose];
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
||||
|
@ -947,7 +947,7 @@ struct ctr_state {
|
||||
}
|
||||
|
||||
__weak MTTcpConnection *weakSelf = self;
|
||||
[_resolveDisposable setDisposable:[resolveSignal startWithNext:^(MTTcpConnectionData *connectionData) {
|
||||
[_resolveDisposable setDisposable:[resolveSignal startWithNextStrict:^(MTTcpConnectionData *connectionData) {
|
||||
[[MTTcpConnection tcpQueue] dispatchOnQueue:^{
|
||||
__strong MTTcpConnection *strongSelf = weakSelf;
|
||||
if (strongSelf == nil || connectionData == nil) {
|
||||
@ -1111,7 +1111,7 @@ struct ctr_state {
|
||||
[strongSelf->_socket readDataToLength:sizeof(struct socks5_ident_resp) withTimeout:-1 tag:MTTcpSocksLogin];
|
||||
}
|
||||
}];
|
||||
}]];
|
||||
} file:__FILE_NAME__ line:__LINE__]];
|
||||
}
|
||||
}];
|
||||
}
|
||||
|
@ -16,7 +16,6 @@ objc_library(
|
||||
"Source",
|
||||
],
|
||||
deps = [
|
||||
"//submodules/SSignalKit/SwiftSignalKit"
|
||||
],
|
||||
sdk_frameworks = [
|
||||
"Foundation",
|
||||
|
Loading…
x
Reference in New Issue
Block a user