@@ -18,10 +18,13 @@ #include #include #include +#include +#include + #include #include #include #import "OFKernelEventObserver.h" @@ -29,11 +32,11 @@ #import "OFKernelEventObserver_kqueue.h" #import "OFDataArray.h" #import "OFArray.h" #import "OFInitializationFailedException.h" -#import "OFOutOfMemoryException.h" +#import "OFObserveFailedException.h" #import "OFOutOfRangeException.h" #import "socket_helpers.h" #define EVENTLIST_SIZE 64 @@ -123,11 +126,11 @@ - (bool)observeForTimeInterval: (of_time_interval_t)timeInterval { void *pool = objc_autoreleasePoolPush(); struct timespec timeout; struct kevent eventList[EVENTLIST_SIZE]; - int i, events, realEvents = 0; + int i, events, errNo, realEvents = 0; timeout.tv_sec = (time_t)timeInterval; timeout.tv_nsec = lrint((timeInterval - timeout.tv_sec) * 1000000000); /* @@ -144,15 +147,17 @@ 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 false; + return [OFObserveFailedException exceptionWithObserver: self + errNo: errNo]; [_changeList removeAllItems]; if (events == 0) return false;