mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-09-15 16:36:36 +00:00
Locking was not quite right here in a certain case where the transaction leaves after other references were removed. Will restore this optimization in the future with more time to analyze. This reverts commit ee524f497d0692a2c0c6ea39bd3840183a00f3ed.
73 lines
1.3 KiB
Plaintext
73 lines
1.3 KiB
Plaintext
//
|
|
// ASMainSerialQueue.m
|
|
// AsyncDisplayKit
|
|
//
|
|
// Created by Garrett Moon on 12/11/15.
|
|
// Copyright © 2015 Facebook. All rights reserved.
|
|
//
|
|
|
|
#import "ASMainSerialQueue.h"
|
|
|
|
#import "ASThread.h"
|
|
|
|
@interface ASMainSerialQueue ()
|
|
{
|
|
ASDN::Mutex _serialQueueLock;
|
|
NSMutableArray *_blocks;
|
|
}
|
|
|
|
@end
|
|
|
|
@implementation ASMainSerialQueue
|
|
|
|
- (instancetype)init
|
|
{
|
|
if (!(self = [super init])) {
|
|
return nil;
|
|
}
|
|
|
|
_blocks = [[NSMutableArray alloc] init];
|
|
return self;
|
|
}
|
|
|
|
- (void)performBlockOnMainThread:(dispatch_block_t)block
|
|
{
|
|
ASDN::MutexLocker l(_serialQueueLock);
|
|
[_blocks addObject:block];
|
|
ASDN::MutexUnlocker u(_serialQueueLock);
|
|
[self runBlocks];
|
|
}
|
|
|
|
- (void)runBlocks
|
|
{
|
|
dispatch_block_t mainThread = ^{
|
|
do {
|
|
ASDN::MutexLocker l(_serialQueueLock);
|
|
dispatch_block_t block;
|
|
if (_blocks.count > 0) {
|
|
block = [_blocks objectAtIndex:0];
|
|
[_blocks removeObjectAtIndex:0];
|
|
} else {
|
|
break;
|
|
}
|
|
ASDN::MutexUnlocker u(_serialQueueLock);
|
|
block();
|
|
} while (true);
|
|
};
|
|
|
|
if ([NSThread isMainThread]) {
|
|
mainThread();
|
|
} else {
|
|
dispatch_async(dispatch_get_main_queue(), ^{
|
|
mainThread();
|
|
});
|
|
}
|
|
}
|
|
|
|
- (NSString *)description
|
|
{
|
|
return [[super description] stringByAppendingFormat:@" Blocks: %@", _blocks];
|
|
}
|
|
|
|
@end
|