@@ -24,11 +24,10 @@ #include #import "OFKernelEventObserver.h" #import "OFKernelEventObserver+Private.h" #import "OFKernelEventObserver_select.h" -#import "OFStream.h" #import "OFArray.h" #import "autorelease.h" #import "macros.h" #import "socket_helpers.h" @@ -47,42 +46,33 @@ } - (void)OF_addFileDescriptorForReading: (int)fd { FD_SET(fd, &_readFDs); - FD_SET(fd, &_exceptFDs); } - (void)OF_addFileDescriptorForWriting: (int)fd { FD_SET(fd, &_writeFDs); - FD_SET(fd, &_exceptFDs); } - (void)OF_removeFileDescriptorForReading: (int)fd { FD_CLR(fd, &_readFDs); - - if (!FD_ISSET(fd, &_writeFDs)) - FD_CLR(fd, &_exceptFDs); } - (void)OF_removeFileDescriptorForWriting: (int)fd { FD_CLR(fd, &_writeFDs); - - if (!FD_ISSET(fd, &_readFDs)) - FD_CLR(fd, &_exceptFDs); } - (bool)observeForTimeInterval: (of_time_interval_t)timeInterval { void *pool = objc_autoreleasePoolPush(); - OFStream **objects; + id *objects; fd_set readFDs; fd_set writeFDs; - fd_set exceptFDs; struct timeval timeout; size_t i, count, realEvents = 0; [self OF_processQueue]; @@ -94,15 +84,13 @@ objc_autoreleasePoolPop(pool); #ifdef FD_COPY FD_COPY(&_readFDs, &readFDs); FD_COPY(&_writeFDs, &writeFDs); - FD_COPY(&_exceptFDs, &exceptFDs); #else readFDs = _readFDs; writeFDs = _writeFDs; - exceptFDs = _exceptFDs; #endif /* * We cast to int before assigning to tv_usec in order to avoid a * warning with Apple GCC on PPC. POSIX defines this as suseconds_t, @@ -110,11 +98,11 @@ * satisfy the required range, we just cast to int. */ timeout.tv_sec = (time_t)timeInterval; timeout.tv_usec = (int)lrint((timeInterval - timeout.tv_sec) * 1000); - if (select((int)_maxFD + 1, &readFDs, &writeFDs, &exceptFDs, + if (select((int)_maxFD + 1, &readFDs, &writeFDs, NULL, (timeInterval != -1 ? &timeout : NULL)) < 1) return false; if (FD_ISSET(_cancelFD[0], &readFDs)) { char buffer; @@ -124,65 +112,41 @@ OF_ENSURE(recvfrom(_cancelFD[0], &buffer, 1, 0, NULL, NULL) > 0); #endif } - objects = [_readStreams objects]; - count = [_readStreams count]; + objects = [_readObjects objects]; + count = [_readObjects count]; for (i = 0; i < count; i++) { int fd = [objects[i] fileDescriptorForReading]; pool = objc_autoreleasePoolPush(); if (FD_ISSET(fd, &readFDs)) { if ([_delegate respondsToSelector: - @selector(streamIsReadyForReading:)]) - [_delegate streamIsReadyForReading: objects[i]]; - - realEvents++; - } - - if (FD_ISSET(fd, &exceptFDs)) { - if ([_delegate respondsToSelector: - @selector(streamDidReceiveException:)]) - [_delegate streamDidReceiveException: - objects[i]]; - - /* - * Prevent calling it twice in case the FD is in both - * sets. - */ - FD_CLR(fd, &exceptFDs); + @selector(objectIsReadyForReading:)]) + [_delegate objectIsReadyForReading: objects[i]]; realEvents++; } objc_autoreleasePoolPop(pool); } - objects = [_writeStreams objects]; - count = [_writeStreams count]; + objects = [_writeObjects objects]; + count = [_writeObjects count]; for (i = 0; i < count; i++) { int fd = [objects[i] fileDescriptorForWriting]; pool = objc_autoreleasePoolPush(); if (FD_ISSET(fd, &writeFDs)) { if ([_delegate respondsToSelector: - @selector(streamIsReadyForWriting:)]) - [_delegate streamIsReadyForWriting: objects[i]]; - - realEvents++; - } - - if (FD_ISSET(fd, &exceptFDs)) { - if ([_delegate respondsToSelector: - @selector(streamDidReceiveException:)]) - [_delegate streamDidReceiveException: - objects[i]]; + @selector(objectIsReadyForWriting:)]) + [_delegate objectIsReadyForWriting: objects[i]]; realEvents++; } objc_autoreleasePoolPop(pool);