Index: src/OFStreamObserver_kqueue.m ================================================================== --- src/OFStreamObserver_kqueue.m +++ src/OFStreamObserver_kqueue.m @@ -101,11 +101,11 @@ - (BOOL)observeWithTimeout: (double)timeout { void *pool = objc_autoreleasePoolPush(); struct timespec timespec; struct kevent eventList[EVENTLIST_SIZE]; - int i, events; + int i, events, realEvents = 0; timespec.tv_sec = timeout; timespec.tv_nsec = (timeout - timespec.tv_sec) * 1000000000; [self _processQueue]; @@ -144,10 +144,12 @@ OF_ENSURE(read(cancelFD[0], &buffer, 1) > 0); continue; } + + realEvents++; pool = objc_autoreleasePoolPush(); if (eventList[i].flags & EV_ERROR) { [delegate streamDidReceiveException: @@ -169,9 +171,12 @@ assert(0); } objc_autoreleasePoolPop(pool); } + + if (realEvents == 0) + return NO; return YES; } @end Index: src/OFStreamObserver_poll.m ================================================================== --- src/OFStreamObserver_poll.m +++ src/OFStreamObserver_poll.m @@ -122,11 +122,11 @@ - (BOOL)observeWithTimeout: (double)timeout { void *pool = objc_autoreleasePoolPush(); struct pollfd *FDsCArray; - size_t i, nFDs; + size_t i, nFDs, realEvents = 0; [self _processQueue]; if ([self _processCache]) { objc_autoreleasePoolPop(pool); @@ -159,27 +159,33 @@ objc_autoreleasePoolPop(pool); continue; } + realEvents++; [delegate streamIsReadyForReading: FDToStream[FDsCArray[i].fd]]; } if (FDsCArray[i].revents & POLLOUT) { + realEvents++; [delegate streamIsReadyForWriting: FDToStream[FDsCArray[i].fd]]; } if (FDsCArray[i].revents & POLLERR) { + realEvents++; [delegate streamDidReceiveException: FDToStream[FDsCArray[i].fd]]; } FDsCArray[i].revents = 0; objc_autoreleasePoolPop(pool); } + + if (realEvents == 0) + return NO; return YES; } @end Index: src/OFStreamObserver_select.m ================================================================== --- src/OFStreamObserver_select.m +++ src/OFStreamObserver_select.m @@ -75,11 +75,11 @@ OFStream **objects; fd_set readFDs_; fd_set writeFDs_; fd_set exceptFDs_; struct timeval time; - size_t i, count; + size_t i, count, realEvents = 0; [self _processQueue]; if ([self _processCache]) { objc_autoreleasePoolPop(pool); @@ -120,14 +120,17 @@ for (i = 0; i < count; i++) { int fileDescriptor = [objects[i] fileDescriptor]; pool = objc_autoreleasePoolPush(); - if (FD_ISSET(fileDescriptor, &readFDs_)) + if (FD_ISSET(fileDescriptor, &readFDs_)) { + realEvents++; [delegate streamIsReadyForReading: objects[i]]; + } if (FD_ISSET(fileDescriptor, &exceptFDs_)) { + realEvents++; [delegate streamDidReceiveException: objects[i]]; /* * Prevent calling it twice in case the FD is in both * sets. @@ -144,17 +147,24 @@ for (i = 0; i < count; i++) { int fileDescriptor = [objects[i] fileDescriptor]; pool = objc_autoreleasePoolPush(); - if (FD_ISSET(fileDescriptor, &writeFDs_)) + if (FD_ISSET(fileDescriptor, &writeFDs_)) { + realEvents++; [delegate streamIsReadyForWriting: objects[i]]; + } - if (FD_ISSET(fileDescriptor, &exceptFDs_)) + if (FD_ISSET(fileDescriptor, &exceptFDs_)) { + realEvents++; [delegate streamDidReceiveException: objects[i]]; + } objc_autoreleasePoolPop(pool); } + + if (realEvents == 0) + return NO; return YES; } @end