@@ -18,10 +18,11 @@ #import "OFRunLoop.h" #import "OFDictionary.h" #import "OFThread.h" #import "OFSortedList.h" +#import "OFMutex.h" #import "OFTimer.h" #import "OFDate.h" #import "autorelease.h" #import "macros.h" @@ -264,10 +265,11 @@ { self = [super init]; @try { timersQueue = [[OFSortedList alloc] init]; + timersQueueLock = [[OFMutex alloc] init]; streamObserver = [[OFStreamObserver alloc] init]; [streamObserver setDelegate: self]; readQueues = [[OFMutableDictionary alloc] init]; @@ -280,21 +282,26 @@ } - (void)dealloc { [timersQueue release]; + [timersQueueLock release]; [streamObserver release]; [readQueues release]; [super dealloc]; } - (void)addTimer: (OFTimer*)timer { - @synchronized (timersQueue) { + [timersQueueLock lock]; + @try { [timersQueue insertObject: timer]; + } @finally { + [timersQueueLock unlock]; } + [streamObserver cancel]; } - (void)streamIsReadyForReading: (OFStream*)stream { @@ -528,11 +535,12 @@ void *pool = objc_autoreleasePoolPush(); OFDate *now = [OFDate date]; OFTimer *timer; OFDate *nextTimer; - @synchronized (timersQueue) { + [timersQueueLock lock]; + @try { of_list_object_t *listObject = [timersQueue firstListObject]; if (listObject != NULL && [[listObject->object fireDate] compare: now] != @@ -541,17 +549,22 @@ [[listObject->object retain] autorelease]; [timersQueue removeListObject: listObject]; } else timer = nil; + } @finally { + [timersQueueLock unlock]; } if ([timer isValid]) [timer fire]; - @synchronized (timersQueue) { + [timersQueueLock lock]; + @try { nextTimer = [[timersQueue firstObject] fireDate]; + } @finally { + [timersQueueLock unlock]; } /* Watch for stream events until the next timer is due */ if (nextTimer != nil) { double timeout = [nextTimer timeIntervalSinceNow];