@@ -43,10 +43,12 @@ - init { self = [super init]; @try { + struct kevent event; + #ifdef HAVE_KQUEUE1 if ((_kernelQueue = kqueue1(O_CLOEXEC)) == -1) @throw [OFInitializationFailedException exceptionWithClass: [self class]]; #else @@ -60,13 +62,14 @@ fcntl(_kernelQueue, F_SETFD, flags | FD_CLOEXEC); #endif _changeList = [[OFDataArray alloc] initWithItemSize: sizeof(struct kevent)]; - _removedArray = [[OFMutableArray alloc] init]; + EV_SET(&event, _cancelFD[0], EVFILT_READ, EV_ADD, 0, 0, 0); + [_changeList addItem: &event]; - [self OF_addFileDescriptorForReading: _cancelFD[0]]; + _removedArray = [[OFMutableArray alloc] init]; } @catch (id e) { [self release]; @throw e; } @@ -81,45 +84,69 @@ [_removedArray release]; [super dealloc]; } -- (void)OF_addFileDescriptorForReading: (int)fd +- (void)OF_addObjectForReading: (id)object { struct kevent event; if ([_changeList count] >= INT_MAX) @throw [OFOutOfRangeException exception]; - EV_SET(&event, fd, EVFILT_READ, EV_ADD, 0, 0, 0); + memset(&event, 0, sizeof(event)); + event.ident = [object fileDescriptorForReading]; + event.filter = EVFILT_READ; + event.flags = EV_ADD; +#ifndef __NetBSD__ + event.udata = object; +#else + event.udata = (intptr_t)object; +#endif + [_changeList addItem: &event]; } -- (void)OF_addFileDescriptorForWriting: (int)fd +- (void)OF_addObjectForWriting: (id)object { struct kevent event; if ([_changeList count] >= INT_MAX) @throw [OFOutOfRangeException exception]; - EV_SET(&event, fd, EVFILT_WRITE, EV_ADD, 0, 0, 0); + memset(&event, 0, sizeof(event)); + event.ident = [object fileDescriptorForWriting]; + event.filter = EVFILT_WRITE; + event.flags = EV_ADD; +#ifndef __NetBSD__ + event.udata = object; +#else + event.udata = (intptr_t)object; +#endif + [_changeList addItem: &event]; } -- (void)OF_removeFileDescriptorForReading: (int)fd +- (void)OF_removeObjectForReading: (id)object { struct kevent event; - EV_SET(&event, fd, EVFILT_READ, EV_DELETE, 0, 0, 0); + memset(&event, 0, sizeof(event)); + event.ident = [object fileDescriptorForReading]; + event.filter = EVFILT_READ; + event.flags = EV_DELETE; [_changeList addItem: &event]; } -- (void)OF_removeFileDescriptorForWriting: (int)fd +- (void)OF_removeObjectForWriting: (id)object { struct kevent event; - EV_SET(&event, fd, EVFILT_WRITE, EV_DELETE, 0, 0, 0); + memset(&event, 0, sizeof(event)); + event.ident = [object fileDescriptorForWriting]; + event.filter = EVFILT_WRITE; + event.flags = EV_DELETE; [_changeList addItem: &event]; } - (bool)observeForTimeInterval: (of_time_interval_t)timeInterval { @@ -173,17 +200,17 @@ switch (eventList[i].filter) { case EVFILT_READ: if ([_delegate respondsToSelector: @selector(objectIsReadyForReading:)]) [_delegate objectIsReadyForReading: - _FDToObject[eventList[i].ident]]; + (id)eventList[i].udata]; break; case EVFILT_WRITE: if ([_delegate respondsToSelector: @selector(objectIsReadyForWriting:)]) [_delegate objectIsReadyForWriting: - _FDToObject[eventList[i].ident]]; + (id)eventList[i].udata]; break; default: assert(0); }