diff --git a/SocketRocket/Internal/RunLoop/SRRunLoopThread.m b/SocketRocket/Internal/RunLoop/SRRunLoopThread.m index baf031f46..071463ae0 100644 --- a/SocketRocket/Internal/RunLoop/SRRunLoopThread.m +++ b/SocketRocket/Internal/RunLoop/SRRunLoopThread.m @@ -10,17 +10,48 @@ // #import "SRRunLoopThread.h" - +#import @interface SRRunLoopThread () -{ - dispatch_group_t _waitGroup; -} @property (nonatomic, strong, readwrite) NSRunLoop *runLoop; +@property (assign, nonatomic) pthread_mutex_t lock; +@property (assign, nonatomic) pthread_cond_t cond; @end @implementation SRRunLoopThread +- (void)dealloc { + // 不用需要销毁 + pthread_mutex_destroy(&_lock); + pthread_cond_destroy(&_cond); +} +- (void)__initMutex:(pthread_mutex_t *)mutex { + + // 1.初始化属性 + pthread_mutexattr_t attr; + pthread_mutexattr_init(&attr); + /* + * Mutex type attributes + */ + // #define PTHREAD_MUTEX_NORMAL 0 + // #define PTHREAD_MUTEX_ERRORCHECK 1 + // #define PTHREAD_MUTEX_RECURSIVE 2 + // #define PTHREAD_MUTEX_DEFAULT PTHREAD_MUTEX_NORMAL + + // pthread_mutexattr_settype(&attr, NULL); 传空,默认 PTHREAD_MUTEX_DEFAULT + pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); + + // 2.初始化锁 + pthread_mutex_init(mutex, &attr); + + // 3.销毁属性 + pthread_mutexattr_destroy(&attr); + + // 初始化条件 + pthread_cond_init(&_cond, NULL); + // 加锁 + pthread_mutex_lock(mutex); +} + (instancetype)sharedThread { @@ -38,18 +69,18 @@ - (instancetype)init { self = [super init]; if (self) { - _waitGroup = dispatch_group_create(); - dispatch_group_enter(_waitGroup); + [self __initMutex:&_lock]; } return self; } - (void)main { + @autoreleasepool { _runLoop = [NSRunLoop currentRunLoop]; - dispatch_group_leave(_waitGroup); - + // 激活一个等待该条件的线程 + pthread_cond_signal(&_cond); // Add an empty run loop source to prevent runloop from spinning. CFRunLoopSourceContext sourceCtx = { .version = 0, @@ -66,9 +97,9 @@ - (void)main CFRunLoopSourceRef source = CFRunLoopSourceCreate(NULL, 0, &sourceCtx); CFRunLoopAddSource(CFRunLoopGetCurrent(), source, kCFRunLoopDefaultMode); CFRelease(source); - + while ([_runLoop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]) { - + } assert(NO); } @@ -76,7 +107,8 @@ - (void)main - (NSRunLoop *)runLoop; { - dispatch_group_wait(_waitGroup, DISPATCH_TIME_FOREVER); + // 等待条件(进入休眠,放开mutex锁;被唤醒后,会再次对mutex加锁) + pthread_cond_wait(&_cond, &_lock); return _runLoop; } diff --git a/SocketRocket/SRWebSocket.m b/SocketRocket/SRWebSocket.m index 16f23ed5a..220eb2df0 100644 --- a/SocketRocket/SRWebSocket.m +++ b/SocketRocket/SRWebSocket.m @@ -18,8 +18,8 @@ #ifdef HAS_ICU #import #endif - -#import +#import +//#import #import "SRDelegateController.h" #import "SRIOConsumer.h" @@ -80,12 +80,12 @@ @interface SRWebSocket () @property (nonatomic, assign, readwrite) BOOL allowsUntrustedSSLCertificates; @property (nonatomic, strong, readonly) SRDelegateController *delegateController; - +@property (assign, nonatomic) os_unfair_lock mLock; @end @implementation SRWebSocket { SRMutex _kvoLock; - OSSpinLock _propertyLock; +// OSSpinLock _propertyLock; dispatch_queue_t _workQueue; NSMutableArray *_consumers; @@ -160,7 +160,8 @@ - (instancetype)initWithURLRequest:(NSURLRequest *)request protocols:(NSArray