@@ -90,129 +90,97 @@ } - (void)OF_addObject: (id)object fileDescriptor: (int)fd events: (int)addEvents - objectsArray: (OFMutableArray*)objectsArray -{ -#ifdef OF_HAVE_THREADS - [_mutex lock]; - @try { -#endif - struct epoll_event event; - intptr_t events; - - events = (intptr_t)[_FDToEvents - valueForKey: (void*)(intptr_t)fd]; - - memset(&event, 0, sizeof(event)); - event.events = (int)events | addEvents; - event.data.ptr = object; - - [objectsArray addObject: object]; - - if (epoll_ctl(_epfd, - (events == 0 ? EPOLL_CTL_ADD : EPOLL_CTL_MOD), - fd, &event) == -1) { - [objectsArray removeObjectIdenticalTo: object]; - @throw [OFObserveFailedException - exceptionWithObserver: self - errNo: errno]; - } - - [_FDToEvents setValue: (void*)(events | addEvents) - forKey: (void*)(intptr_t)fd]; -#ifdef OF_HAVE_THREADS - } @finally { - [_mutex unlock]; - } -#endif +{ + struct epoll_event event; + intptr_t events; + + events = (intptr_t)[_FDToEvents valueForKey: (void*)(intptr_t)fd]; + + memset(&event, 0, sizeof(event)); + event.events = (int)events | addEvents; + event.data.ptr = object; + + if (epoll_ctl(_epfd, (events == 0 ? EPOLL_CTL_ADD : EPOLL_CTL_MOD), + fd, &event) == -1) + @throw [OFObserveFailedException exceptionWithObserver: self + errNo: errno]; + + [_FDToEvents setValue: (void*)(events | addEvents) + forKey: (void*)(intptr_t)fd]; } - (void)OF_removeObject: (id)object fileDescriptor: (int)fd events: (int)removeEvents - objectsArray: (OFMutableArray*)objectsArray -{ -#ifdef OF_HAVE_THREADS - [_mutex lock]; - @try { -#endif - intptr_t events; - - events = (intptr_t)[_FDToEvents - valueForKey: (void*)(intptr_t)fd]; - events &= ~removeEvents; - - if (events == 0) { - if (epoll_ctl(_epfd, EPOLL_CTL_DEL, fd, NULL) == -1) - @throw [OFObserveFailedException - exceptionWithObserver: self - errNo: errno]; - - [_FDToEvents removeValueForKey: (void*)(intptr_t)fd]; - } else { - struct epoll_event event; - - memset(&event, 0, sizeof(event)); - event.events = (int)events; - event.data.ptr = object; - - if (epoll_ctl(_epfd, EPOLL_CTL_MOD, fd, &event) == -1) - @throw [OFObserveFailedException - exceptionWithObserver: self - errNo: errno]; - - [_FDToEvents setValue: (void*)events - forKey: (void*)(intptr_t)fd]; - } - - [objectsArray removeObjectIdenticalTo: object]; -#ifdef OF_HAVE_THREADS - } @finally { - [_mutex unlock]; - } -#endif -} - -- (void)addObjectForReading: (id )object -{ - [self OF_addObject: object - fileDescriptor: [object fileDescriptorForReading] - events: EPOLLIN - objectsArray: _readObjects]; -} - -- (void)addObjectForWriting: (id )object -{ - [self OF_addObject: object - fileDescriptor: [object fileDescriptorForWriting] - events: EPOLLOUT - objectsArray: _writeObjects]; -} - -- (void)removeObjectForReading: (id )object -{ - [self OF_removeObject: object - fileDescriptor: [object fileDescriptorForReading] - events: EPOLLIN - objectsArray: _readObjects]; -} - -- (void)removeObjectForWriting: (id )object -{ - [self OF_removeObject: object - fileDescriptor: [object fileDescriptorForWriting] - events: EPOLLOUT - objectsArray: _writeObjects]; +{ + intptr_t events; + + events = (intptr_t)[_FDToEvents valueForKey: (void*)(intptr_t)fd]; + events &= ~removeEvents; + + if (events == 0) { + if (epoll_ctl(_epfd, EPOLL_CTL_DEL, fd, NULL) == -1) + @throw [OFObserveFailedException + exceptionWithObserver: self + errNo: errno]; + + [_FDToEvents removeValueForKey: (void*)(intptr_t)fd]; + } else { + struct epoll_event event; + + memset(&event, 0, sizeof(event)); + event.events = (int)events; + event.data.ptr = object; + + if (epoll_ctl(_epfd, EPOLL_CTL_MOD, fd, &event) == -1) + @throw [OFObserveFailedException + exceptionWithObserver: self + errNo: errno]; + + [_FDToEvents setValue: (void*)events + forKey: (void*)(intptr_t)fd]; + } +} + +- (void)OF_addObjectForReading: (id )object +{ + [self OF_addObject: object + fileDescriptor: [object fileDescriptorForReading] + events: EPOLLIN]; +} + +- (void)OF_addObjectForWriting: (id )object +{ + [self OF_addObject: object + fileDescriptor: [object fileDescriptorForWriting] + events: EPOLLOUT]; +} + +- (void)OF_removeObjectForReading: (id )object +{ + [self OF_removeObject: object + fileDescriptor: [object fileDescriptorForReading] + events: EPOLLIN]; +} + +- (void)OF_removeObjectForWriting: (id )object +{ + [self OF_removeObject: object + fileDescriptor: [object fileDescriptorForWriting] + events: EPOLLOUT]; } - (void)observeForTimeInterval: (of_time_interval_t)timeInterval { OFNull *nullObject = [OFNull null]; struct epoll_event eventList[EVENTLIST_SIZE]; int events; + + [self OF_processQueue]; if ([self OF_processReadBuffers]) return; events = epoll_wait(_epfd, eventList, EVENTLIST_SIZE, @@ -231,11 +199,11 @@ continue; } if (eventList[i].events & EPOLLIN) { - pool = objc_autoreleasePoolPush(); + void *pool = objc_autoreleasePoolPush(); if ([_delegate respondsToSelector: @selector(objectIsReadyForReading:)]) [_delegate objectIsReadyForReading: eventList[i].data.ptr]; @@ -242,11 +210,11 @@ objc_autoreleasePoolPop(pool); } if (eventList[i].events & EPOLLOUT) { - pool = objc_autoreleasePoolPush(); + void *pool = objc_autoreleasePoolPush(); if ([_delegate respondsToSelector: @selector(objectIsReadyForWriting:)]) [_delegate objectIsReadyForWriting: eventList[i].data.ptr];