diff --git a/submodules/MtProtoKit/PublicHeaders/MtProtoKit/MTSignal.h b/submodules/MtProtoKit/PublicHeaders/MtProtoKit/MTSignal.h index c7e852057d..d00926cfd4 100644 --- a/submodules/MtProtoKit/PublicHeaders/MtProtoKit/MTSignal.h +++ b/submodules/MtProtoKit/PublicHeaders/MtProtoKit/MTSignal.h @@ -13,8 +13,13 @@ - (instancetype)initWithGenerator:(id (^)(MTSubscriber *))generator; - (id)startWithNext:(void (^)(id next))next error:(void (^)(id error))error completed:(void (^)())completed; +- (id)startWithNextStrict:(void (^)(id next))next error:(void (^)(id error))error completed:(void (^)())completed file:(const char *)file line:(int)line; + - (id)startWithNext:(void (^)(id next))next; +- (id)startWithNextStrict:(void (^)(id next))next file:(const char *)file line:(int)line; + - (id)startWithNext:(void (^)(id next))next completed:(void (^)())completed; +- (id)startWithNextStrict:(void (^)(id next))next completed:(void (^)())completed file:(const char *)file line:(int)line; + (MTSignal *)single:(id)next; + (MTSignal *)fail:(id)error; diff --git a/submodules/MtProtoKit/Sources/MTContext.m b/submodules/MtProtoKit/Sources/MTContext.m index 7b425dc085..dba8f3f394 100644 --- a/submodules/MtProtoKit/Sources/MTContext.m +++ b/submodules/MtProtoKit/Sources/MTContext.m @@ -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 *next) { + [disposable setDisposable:[signal startWithNextStrict:^(NSArray *next) { [[MTContext contextQueue] dispatchOnQueue:^{ __strong MTContext *strongSelf = weakSelf; if (strongSelf != nil) { + id 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 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__]; } }]; } diff --git a/submodules/MtProtoKit/Sources/MTDNS.m b/submodules/MtProtoKit/Sources/MTDNS.m index 0b99d81516..3448e7f239 100644 --- a/submodules/MtProtoKit/Sources/MTDNS.m +++ b/submodules/MtProtoKit/Sources/MTDNS.m @@ -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; diff --git a/submodules/MtProtoKit/Sources/MTDisposable.m b/submodules/MtProtoKit/Sources/MTDisposable.m index cb673e0b68..949f1d4e88 100644 --- a/submodules/MtProtoKit/Sources/MTDisposable.m +++ b/submodules/MtProtoKit/Sources/MTDisposable.m @@ -1,13 +1,11 @@ #import -#import -#import -#import +#import #import -@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 _disposable; } @@ -76,128 +62,139 @@ @implementation MTMetaDisposable -- (void)setDisposable:(id)disposable -{ - id previousDisposable = nil; - bool dispose = false; +- (instancetype)init { + self = [super init]; + if (self != nil) { + pthread_mutex_init(&_lock, nil); + } + return self; +} + +- (void)dealloc { + id freeDisposable = nil; + pthread_mutex_lock(&_lock); + if (_disposable) { + freeDisposable = _disposable; + _disposable = nil; + } + pthread_mutex_unlock(&_lock); - os_unfair_lock_lock(&_lock); - dispose = _disposed; - if (!dispose) - { + if (freeDisposable) { + } + + pthread_mutex_destroy(&_lock); +} + +- (void)setDisposable:(id)disposable { + id 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 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 _singleDisposable; - NSArray *_multipleDisposables; + NSMutableArray> *_disposables; } @end @implementation MTDisposableSet -- (void)add:(id)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; +} + +- (void)dealloc { + NSArray> *disposables = nil; + pthread_mutex_lock(&_lock); + disposables = _disposables; + _disposables = nil; + pthread_mutex_unlock(&_lock); - if (dispose) + if (disposables) { + } + pthread_mutex_destroy(&_lock); +} + +- (void)add:(id)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)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 singleDisposable = nil; - NSArray *multipleDisposables = nil; - - os_unfair_lock_lock(&_lock); - if (!_disposed) - { +- (void)dispose { + NSArray> *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 disposable in multipleDisposables) - { + if (disposables) { + for (id disposable in disposables) { [disposable dispose]; } } diff --git a/submodules/MtProtoKit/Sources/MTProto.m b/submodules/MtProtoKit/Sources/MTProto.m index 725a95e696..91a79f97c2 100644 --- a/submodules/MtProtoKit/Sources/MTProto.m +++ b/submodules/MtProtoKit/Sources/MTProto.m @@ -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__]]; } } }]; diff --git a/submodules/MtProtoKit/Sources/MTSignal.m b/submodules/MtProtoKit/Sources/MTSignal.m index f1c06c919b..f1065bce71 100644 --- a/submodules/MtProtoKit/Sources/MTSignal.m +++ b/submodules/MtProtoKit/Sources/MTSignal.m @@ -1,6 +1,6 @@ #import -#import +#import #import #import #import @@ -8,28 +8,97 @@ @interface MTSubscriberDisposable : NSObject { - MTSubscriber *_subscriber; + __weak MTSubscriber *_subscriber; id _disposable; + pthread_mutex_t _lock; } @end @implementation MTSubscriberDisposable -- (instancetype)initWithSubscriber:(MTSubscriber *)subscriber disposable:(id)disposable -{ +- (instancetype)initWithSubscriber:(MTSubscriber *)subscriber disposable:(id)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 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 { + id _disposable; + const char *_file; + int _line; + +#if DEBUG + pthread_mutex_t _lock; + bool _isDisposed; +#endif +} + +- (instancetype)initWithDisposable:(id)disposable file:(const char *)file line:(int)line; +- (void)dispose; + +@end + +@implementation MTStrictDisposable + +- (instancetype)initWithDisposable:(id)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 { - 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)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)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 disposable = _generator(subscriber); + [subscriber _assignDisposable:disposable]; + return [[MTStrictDisposable alloc] initWithDisposable:[[MTSubscriberDisposable alloc] initWithSubscriber:subscriber disposable:disposable] file:file line:line]; +} + - (id)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)startWithNextStrict:(void (^)(id next))next file:(const char *)file line:(int)line +{ + MTSubscriber *subscriber = [[MTSubscriber alloc] initWithNext:next error:nil completed:nil]; + id disposable = _generator(subscriber); + [subscriber _assignDisposable:disposable]; + return [[MTStrictDisposable alloc] initWithDisposable:[[MTSubscriberDisposable alloc] initWithSubscriber:subscriber disposable:disposable] file:file line:line]; +} + - (id)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)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 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 (MTSubscriber *subscriber) @@ -324,11 +423,11 @@ { return [[MTSignal alloc] initWithGenerator:^id (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 (MTSubscriber *subscriber) { - MTMetaDisposable *disposable = [[MTMetaDisposable alloc] init]; - - MTTimer *timer = [[MTTimer alloc] initWithTimeout:seconds repeat:false completion:^ - { - [disposable setDisposable:[signal startWithNext:^(id next) + MTMetaDisposable *startDisposable = [[MTMetaDisposable alloc] init]; + MTMetaDisposable *timerDisposable = [[MTMetaDisposable alloc] init]; + + 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]; + }]; }]; } diff --git a/submodules/MtProtoKit/Sources/MTSubscriber.m b/submodules/MtProtoKit/Sources/MTSubscriber.m index da600346c9..db324ed7d0 100644 --- a/submodules/MtProtoKit/Sources/MTSubscriber.m +++ b/submodules/MtProtoKit/Sources/MTSubscriber.m @@ -68,6 +68,7 @@ { os_unfair_lock_lock(&_lock); MTSubscriberBlocks *blocks = nil; + id 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 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 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 disposable = nil; + + os_unfair_lock_lock(&_lock); + disposable = _disposable; + _disposable = nil; + os_unfair_lock_unlock(&_lock); + + if (disposable) { + [disposable dispose]; + } } @end diff --git a/submodules/MtProtoKit/Sources/MTTcpConnection.m b/submodules/MtProtoKit/Sources/MTTcpConnection.m index dd2755e68d..e8cf239881 100644 --- a/submodules/MtProtoKit/Sources/MTTcpConnection.m +++ b/submodules/MtProtoKit/Sources/MTTcpConnection.m @@ -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__]]; } }]; } diff --git a/submodules/SSignalKit/SSignalKit/BUILD b/submodules/SSignalKit/SSignalKit/BUILD index eb2b9a82f7..98f1b6f95c 100644 --- a/submodules/SSignalKit/SSignalKit/BUILD +++ b/submodules/SSignalKit/SSignalKit/BUILD @@ -16,7 +16,6 @@ objc_library( "Source", ], deps = [ - "//submodules/SSignalKit/SwiftSignalKit" ], sdk_frameworks = [ "Foundation",