@@ -18,13 +18,15 @@ #include #import "OFRunLoop.h" #import "OFDictionary.h" -#import "OFThread.h" +#ifdef OF_THREADS +# import "OFThread.h" +# import "OFMutex.h" +#endif #import "OFSortedList.h" -#import "OFMutex.h" #import "OFTimer.h" #import "OFDate.h" #import "autorelease.h" #import "macros.h" @@ -134,18 +136,20 @@ return [[mainRunLoop retain] autorelease]; } + (OFRunLoop*)currentRunLoop { +#ifdef OF_THREADS return [[OFThread currentThread] runLoop]; +#else + return [self mainRunLoop]; +#endif } -+ (void)OF_setMainRunLoop ++ (void)OF_setMainRunLoop: (OFRunLoop*)runLoop { - void *pool = objc_autoreleasePoolPush(); - mainRunLoop = [[self currentRunLoop] retain]; - objc_autoreleasePoolPop(pool); + mainRunLoop = [runLoop retain]; } #define ADD(type, code) \ void *pool = objc_autoreleasePoolPush(); \ OFRunLoop *runLoop = [self currentRunLoop]; \ @@ -283,11 +287,13 @@ { self = [super init]; @try { timersQueue = [[OFSortedList alloc] init]; +#ifdef OF_THREADS timersQueueLock = [[OFMutex alloc] init]; +#endif streamObserver = [[OFStreamObserver alloc] init]; [streamObserver setDelegate: self]; readQueues = [[OFMutableDictionary alloc] init]; @@ -300,47 +306,57 @@ } - (void)dealloc { [timersQueue release]; +#ifdef OF_THREADS [timersQueueLock release]; +#endif [streamObserver release]; [readQueues release]; [super dealloc]; } - (void)addTimer: (OFTimer*)timer { +#ifdef OF_THREADS [timersQueueLock lock]; @try { +#endif [timersQueue insertObject: timer]; +#ifdef OF_THREADS } @finally { [timersQueueLock unlock]; } +#endif [timer OF_setInRunLoop: self]; [streamObserver cancel]; } - (void)OF_removeTimer: (OFTimer*)timer { +#ifdef OF_THREADS [timersQueueLock lock]; @try { +#endif of_list_object_t *iter; for (iter = [timersQueue firstListObject]; iter != NULL; iter = iter->next) { if ([iter->object isEqual: timer]) { [timersQueue removeListObject: iter]; break; } } +#ifdef OF_THREADS } @finally { [timersQueueLock unlock]; } +#endif } - (void)streamIsReadyForReading: (OFStream*)stream { OFList *queue = [readQueues objectForKey: stream]; @@ -573,12 +589,14 @@ void *pool = objc_autoreleasePoolPush(); OFDate *now = [OFDate date]; OFTimer *timer; OFDate *nextTimer; +#ifdef OF_THREADS [timersQueueLock lock]; @try { +#endif of_list_object_t *listObject = [timersQueue firstListObject]; if (listObject != NULL && [[listObject->object fireDate] compare: now] != @@ -589,23 +607,29 @@ [timersQueue removeListObject: listObject]; [timer OF_setInRunLoop: nil]; } else timer = nil; +#ifdef OF_THREADS } @finally { [timersQueueLock unlock]; } +#endif if ([timer isValid]) [timer fire]; +#ifdef OF_THREADS [timersQueueLock lock]; @try { +#endif nextTimer = [[timersQueue firstObject] fireDate]; +#ifdef OF_THREADS } @finally { [timersQueueLock unlock]; } +#endif /* Watch for stream events until the next timer is due */ if (nextTimer != nil) { double timeout = [nextTimer timeIntervalSinceNow];