@@ -16,20 +16,22 @@ #define __NO_EXT_QNX #include "config.h" -#include +#include #include +#include #include #import "OFKernelEventObserver.h" #import "OFKernelEventObserver+Private.h" #import "OFKernelEventObserver_select.h" #import "OFArray.h" +#import "OFObserveFailedException.h" #import "OFOutOfRangeException.h" #import "socket_helpers.h" @implementation OFKernelEventObserver_select @@ -82,10 +84,11 @@ void *pool = objc_autoreleasePoolPush(); id const *objects; fd_set readFDs; fd_set writeFDs; struct timeval timeout; + int events; size_t i, count, realEvents = 0; [self OF_processQueueAndStoreRemovedIn: nil]; if ([self OF_processCache]) { @@ -114,12 +117,18 @@ #else timeout.tv_sec = (long)timeInterval; #endif timeout.tv_usec = (int)lrint((timeInterval - timeout.tv_sec) * 1000); - if (select((int)_maxFD + 1, &readFDs, &writeFDs, NULL, - (timeInterval != -1 ? &timeout : NULL)) < 1) + events = select((int)_maxFD + 1, &readFDs, &writeFDs, NULL, + (timeInterval != -1 ? &timeout : NULL)); + + if (events < 0) + @throw [OFObserveFailedException exceptionWithObserver: self + errNo: errno]; + + if (events == 0) return false; if (FD_ISSET(_cancelFD[0], &readFDs)) { char buffer; #ifndef _WIN32