Index: src/OFStreamObserver.h ================================================================== --- src/OFStreamObserver.h +++ src/OFStreamObserver.h @@ -176,10 +176,19 @@ * \param timeout The time to wait for an event, in seconds * \return A boolean whether events occurred during the timeinterval */ - (BOOL)observeWithTimeout: (double)timeout; +/** + * \brief Cancels the currently blocking observe call. + * + * This is automatically done when a new stream is added or removed by another + * thread, but in some circumstances, it might be desirable for a thread to + * manually stop the observe running in another thread. + */ +- (void)cancel; + - (void)_addFileDescriptorForReading: (int)fd; - (void)_addFileDescriptorForWriting: (int)fd; - (void)_removeFileDescriptorForReading: (int)fd; - (void)_removeFileDescriptorForWriting: (int)fd; - (void)_processQueue; Index: src/OFStreamObserver.m ================================================================== --- src/OFStreamObserver.m +++ src/OFStreamObserver.m @@ -196,16 +196,11 @@ [queueFDs addItem: &fd]; } @finally { [mutex unlock]; } -#ifndef _WIN32 - OF_ENSURE(write(cancelFD[1], "", 1) > 0); -#else - OF_ENSURE(sendto(cancelFD[1], "", 1, 0, (struct sockaddr*)&cancelAddr, - sizeof(cancelAddr)) > 0); -#endif + [self cancel]; } - (void)addStreamForWriting: (OFStream*)stream { [mutex lock]; @@ -218,16 +213,11 @@ [queueFDs addItem: &fd]; } @finally { [mutex unlock]; } -#ifndef _WIN32 - OF_ENSURE(write(cancelFD[1], "", 1) > 0); -#else - OF_ENSURE(sendto(cancelFD[1], "", 1, 0, (struct sockaddr*)&cancelAddr, - sizeof(cancelAddr)) > 0); -#endif + [self cancel]; } - (void)removeStreamForReading: (OFStream*)stream { [mutex lock]; @@ -373,10 +363,20 @@ - (BOOL)observeWithTimeout: (double)timeout { @throw [OFNotImplementedException exceptionWithClass: [self class] selector: _cmd]; } + +- (void)cancel +{ +#ifndef _WIN32 + OF_ENSURE(write(cancelFD[1], "", 1) > 0); +#else + OF_ENSURE(sendto(cancelFD[1], "", 1, 0, (struct sockaddr*)&cancelAddr, + sizeof(cancelAddr)) > 0); +#endif +} - (BOOL)_processCache { OFStream **objects = [readStreams objects]; size_t i, count = [readStreams count];