@@ -83,11 +83,11 @@ close(_kernelQueue); [super dealloc]; } -- (void)addObjectForReading: (id )object +- (void)OF_addObjectForReading: (id )object { struct kevent event; memset(&event, 0, sizeof(event)); event.ident = [object fileDescriptorForReading]; @@ -97,30 +97,16 @@ event.udata = object; #else event.udata = (intptr_t)object; #endif -#ifdef OF_HAVE_THREADS - [_mutex lock]; - @try { -#endif - [_readObjects addObject: object]; - - if (kevent(_kernelQueue, &event, 1, NULL, 0, NULL) != 0) { - [_readObjects removeObjectIdenticalTo: object]; - @throw [OFObserveFailedException - exceptionWithObserver: self - errNo: errno]; - } -#ifdef OF_HAVE_THREADS - } @finally { - [_mutex unlock]; - } -#endif -} - -- (void)addObjectForWriting: (id )object + if (kevent(_kernelQueue, &event, 1, NULL, 0, NULL) != 0) + @throw [OFObserveFailedException exceptionWithObserver: self + errNo: errno]; +} + +- (void)OF_addObjectForWriting: (id )object { struct kevent event; memset(&event, 0, sizeof(event)); event.ident = [object fileDescriptorForWriting]; @@ -130,86 +116,50 @@ event.udata = object; #else event.udata = (intptr_t)object; #endif -#ifdef OF_HAVE_THREADS - [_mutex lock]; - @try { -#endif - [_writeObjects addObject: object]; - - if (kevent(_kernelQueue, &event, 1, NULL, 0, NULL) != 0) { - [_writeObjects removeObjectIdenticalTo: object]; - @throw [OFObserveFailedException - exceptionWithObserver: self - errNo: errno]; - } -#ifdef OF_HAVE_THREADS - } @finally { - [_mutex unlock]; - } -#endif -} - -- (void)removeObjectForReading: (id )object + if (kevent(_kernelQueue, &event, 1, NULL, 0, NULL) != 0) + @throw [OFObserveFailedException exceptionWithObserver: self + errNo: errno]; +} + +- (void)OF_removeObjectForReading: (id )object { struct kevent event; memset(&event, 0, sizeof(event)); event.ident = [object fileDescriptorForReading]; event.filter = EVFILT_READ; event.flags = EV_DELETE; -#ifdef OF_HAVE_THREADS - [_mutex lock]; - @try { -#endif - if (kevent(_kernelQueue, &event, 1, NULL, 0, NULL) != 0) - @throw [OFObserveFailedException - exceptionWithObserver: self - errNo: errno]; - - [_readObjects removeObjectIdenticalTo: object]; -#ifdef OF_HAVE_THREADS - } @finally { - [_mutex unlock]; - } -#endif -} - -- (void)removeObjectForWriting: (id )object + if (kevent(_kernelQueue, &event, 1, NULL, 0, NULL) != 0) + @throw [OFObserveFailedException exceptionWithObserver: self + errNo: errno]; +} + +- (void)OF_removeObjectForWriting: (id )object { struct kevent event; memset(&event, 0, sizeof(event)); event.ident = [object fileDescriptorForWriting]; event.filter = EVFILT_WRITE; event.flags = EV_DELETE; -#ifdef OF_HAVE_THREADS - [_mutex lock]; - @try { -#endif - if (kevent(_kernelQueue, &event, 1, NULL, 0, NULL) != 0) - @throw [OFObserveFailedException - exceptionWithObserver: self - errNo: errno]; - - [_writeObjects removeObjectIdenticalTo: object]; -#ifdef OF_HAVE_THREADS - } @finally { - [_mutex unlock]; - } -#endif + if (kevent(_kernelQueue, &event, 1, NULL, 0, NULL) != 0) + @throw [OFObserveFailedException exceptionWithObserver: self + errNo: errno]; } - (void)observeForTimeInterval: (of_time_interval_t)timeInterval { struct timespec timeout; struct kevent eventList[EVENTLIST_SIZE]; int events; + + [self OF_processQueue]; if ([self OF_processReadBuffers]) return; timeout.tv_sec = (time_t)timeInterval;