@@ -316,12 +316,32 @@ [timersQueue insertObject: timer]; } @finally { [timersQueueLock unlock]; } + [timer OF_setInRunLoop: self]; + [streamObserver cancel]; } + +- (void)OF_removeTimer: (OFTimer*)timer +{ + [timersQueueLock lock]; + @try { + of_list_object_t *iter; + + for (iter = [timersQueue firstListObject]; iter != NULL; + iter = iter->next) { + if ([iter->object isEqual: timer]) { + [timersQueue removeListObject: iter]; + break; + } + } + } @finally { + [timersQueueLock unlock]; + } +} - (void)streamIsReadyForReading: (OFStream*)stream { OFList *queue = [readQueues objectForKey: stream]; of_list_object_t *listObject; @@ -565,10 +585,12 @@ OF_ORDERED_DESCENDING) { timer = [[listObject->object retain] autorelease]; [timersQueue removeListObject: listObject]; + + [timer OF_setInRunLoop: nil]; } else timer = nil; } @finally { [timersQueueLock unlock]; }