Index: src/OFKernelEventObserver.m ================================================================== --- src/OFKernelEventObserver.m +++ src/OFKernelEventObserver.m @@ -405,23 +405,23 @@ id const *objects = [_readObjects objects]; size_t i, count = [_readObjects count]; bool foundInCache = false; for (i = 0; i < count; i++) { + void *pool = objc_autoreleasePoolPush(); + if ([objects[i] isKindOfClass: [OFStream class]] && [objects[i] hasDataInReadBuffer] && ![objects[i] OF_isWaitingForDelimiter]) { - void *pool = objc_autoreleasePoolPush(); - if ([_delegate respondsToSelector: @selector(objectIsReadyForReading:)]) [_delegate objectIsReadyForReading: objects[i]]; foundInCache = true; + } - objc_autoreleasePoolPop(pool); - } + objc_autoreleasePoolPop(pool); } /* * As long as we have data in the cache for any stream, we don't want * to block. Index: src/OFKernelEventObserver_kqueue.m ================================================================== --- src/OFKernelEventObserver_kqueue.m +++ src/OFKernelEventObserver_kqueue.m @@ -35,12 +35,10 @@ #import "OFInitializationFailedException.h" #import "OFObserveFailedException.h" #import "OFOutOfRangeException.h" -#import "socket_helpers.h" - #define EVENTLIST_SIZE 64 @implementation OFKernelEventObserver_kqueue - init { @@ -126,11 +124,11 @@ - (bool)observeForTimeInterval: (of_time_interval_t)timeInterval { void *pool = objc_autoreleasePoolPush(); struct timespec timeout; struct kevent eventList[EVENTLIST_SIZE]; - int i, events, errNo, realEvents = 0; + int i, events, realEvents = 0; timeout.tv_sec = (time_t)timeInterval; timeout.tv_nsec = lrint((timeInterval - timeout.tv_sec) * 1000000000); /* @@ -147,34 +145,31 @@ objc_autoreleasePoolPop(pool); events = kevent(_kernelQueue, [_changeList items], (int)[_changeList count], eventList, EVENTLIST_SIZE, (timeInterval == -1 ? NULL : &timeout)); - errNo = errno; - - [_removedArray removeAllObjects]; if (events < 0) return [OFObserveFailedException exceptionWithObserver: self - errNo: errNo]; + errNo: errno]; [_changeList removeAllItems]; + [_removedArray removeAllObjects]; if (events == 0) return false; for (i = 0; i < events; i++) { if (eventList[i].ident == _cancelFD[0]) { char buffer; - OF_ENSURE(read(_cancelFD[0], &buffer, 1) > 0); + assert(eventList[i].filter == EVFILT_READ); + OF_ENSURE(read(_cancelFD[0], &buffer, 1) == 1); continue; } - realEvents++; - pool = objc_autoreleasePoolPush(); switch (eventList[i].filter) { case EVFILT_READ: if ([_delegate respondsToSelector: @@ -191,13 +186,15 @@ default: assert(0); } objc_autoreleasePoolPop(pool); + + realEvents++; } if (realEvents == 0) return false; return true; } @end Index: src/OFKernelEventObserver_poll.m ================================================================== --- src/OFKernelEventObserver_poll.m +++ src/OFKernelEventObserver_poll.m @@ -163,46 +163,49 @@ if (events == 0) return false; for (i = 0; i < nFDs; i++) { - pool = objc_autoreleasePoolPush(); - if (FDs[i].revents & POLLIN) { if (FDs[i].fd == _cancelFD[0]) { char buffer; - OF_ENSURE(read(_cancelFD[0], &buffer, 1) > 0); + OF_ENSURE(read(_cancelFD[0], &buffer, 1) == 1); FDs[i].revents = 0; - objc_autoreleasePoolPop(pool); continue; } + + pool = objc_autoreleasePoolPush(); if ([_delegate respondsToSelector: @selector(objectIsReadyForReading:)]) [_delegate objectIsReadyForReading: _FDToObject[FDs[i].fd]]; + objc_autoreleasePoolPop(pool); + realEvents++; } if (FDs[i].revents & POLLOUT) { + pool = objc_autoreleasePoolPush(); + if ([_delegate respondsToSelector: @selector(objectIsReadyForWriting:)]) [_delegate objectIsReadyForWriting: _FDToObject[FDs[i].fd]]; + objc_autoreleasePoolPop(pool); + realEvents++; } FDs[i].revents = 0; - - objc_autoreleasePoolPop(pool); } if (realEvents == 0) return false; return true; } @end Index: src/OFKernelEventObserver_select.m ================================================================== --- src/OFKernelEventObserver_select.m +++ src/OFKernelEventObserver_select.m @@ -129,15 +129,16 @@ if (events == 0) return false; if (FD_ISSET(_cancelFD[0], &readFDs)) { char buffer; + #ifndef _WIN32 - OF_ENSURE(read(_cancelFD[0], &buffer, 1) > 0); + OF_ENSURE(read(_cancelFD[0], &buffer, 1) == 1); #else OF_ENSURE(recvfrom(_cancelFD[0], &buffer, 1, 0, NULL, - NULL) > 0); + NULL) == 1); #endif } objects = [_readObjects objects]; count = [_readObjects count];