@@ -1,8 +1,8 @@ /* - * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015 - * Jonathan Schleifer + * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016 + * Jonathan Schleifer * * All rights reserved. * * This file is part of ObjFW. It may be distributed under the terms of the * Q Public License 1.0, which can be found in the file LICENSE.QPL included in @@ -123,49 +123,48 @@ break; } } } -- (void)OF_addObjectForReading: (id)object +- (void)OF_addObjectForReading: (id )object { [self OF_addObject: object fileDescriptor: [object fileDescriptorForReading] events: POLLIN]; } -- (void)OF_addObjectForWriting: (id)object +- (void)OF_addObjectForWriting: (id )object { [self OF_addObject: object fileDescriptor: [object fileDescriptorForWriting] events: POLLOUT]; } -- (void)OF_removeObjectForReading: (id)object +- (void)OF_removeObjectForReading: (id )object { [self OF_removeObject: object fileDescriptor: [object fileDescriptorForReading] events: POLLIN]; } -- (void)OF_removeObjectForWriting: (id)object +- (void)OF_removeObjectForWriting: (id )object { [self OF_removeObject: object fileDescriptor: [object fileDescriptorForWriting] events: POLLOUT]; } - (void)observeForTimeInterval: (of_time_interval_t)timeInterval { - void *pool = objc_autoreleasePoolPush(); struct pollfd *FDs; int events; size_t i, nFDs; - [self OF_processQueueAndStoreRemovedIn: nil]; - [self OF_processReadBuffers]; + [self OF_processQueue]; - objc_autoreleasePoolPop(pool); + if ([self OF_processReadBuffers]) + return; FDs = [_FDs items]; nFDs = [_FDs count]; #ifdef OPEN_MAX @@ -182,14 +181,21 @@ for (i = 0; i < nFDs; i++) { assert(FDs[i].fd <= _maxFD); if (FDs[i].revents & POLLIN) { + void *pool; + if (FDs[i].fd == _cancelFD[0]) { char buffer; +#ifdef OF_HAVE_PIPE OF_ENSURE(read(_cancelFD[0], &buffer, 1) == 1); +#else + OF_ENSURE(recvfrom(_cancelFD[0], &buffer, 1, + 0, NULL, NULL) == 1); +#endif FDs[i].revents = 0; continue; } @@ -202,11 +208,11 @@ objc_autoreleasePoolPop(pool); } if (FDs[i].revents & POLLOUT) { - pool = objc_autoreleasePoolPush(); + void *pool = objc_autoreleasePoolPush(); if ([_delegate respondsToSelector: @selector(objectIsReadyForWriting:)]) [_delegate objectIsReadyForWriting: _FDToObject[FDs[i].fd]];