Index: src/OFStreamObserver.m ================================================================== --- src/OFStreamObserver.m +++ src/OFStreamObserver.m @@ -331,10 +331,11 @@ for (i = 0; i < count; i++) { if (cArray[i]->cache != NULL) { [delegate streamDidBecomeReadyForReading: cArray[i]]; foundInCache = YES; + [pool releaseObjects]; } } /* * As long as we have data in the cache for any stream, we don't want @@ -359,22 +360,25 @@ if (fds_c[i].revents & POLLIN) { num = [OFNumber numberWithInt: fds_c[i].fd]; stream = [fdToStream objectForKey: num]; [delegate streamDidBecomeReadyForReading: stream]; + [pool releaseObjects]; } if (fds_c[i].revents & POLLOUT) { num = [OFNumber numberWithInt: fds_c[i].fd]; stream = [fdToStream objectForKey: num]; [delegate streamDidBecomeReadyForReading: stream]; + [pool releaseObjects]; } if (fds_c[i].revents & POLLERR) { num = [OFNumber numberWithInt: fds_c[i].fd]; stream = [fdToStream objectForKey: num]; [delegate streamDidReceiveException: stream]; + [pool releaseObjects]; } fds_c[i].revents = 0; } #else @@ -393,15 +397,18 @@ return NO; for (i = 0; i < count; i++) { int fd = [cArray[i] fileDescriptor]; - if (FD_ISSET(fd, &readfds_)) + if (FD_ISSET(fd, &readfds_)) { [delegate streamDidBecomeReadyForReading: cArray[i]]; + [pool releaseObjects]; + } if (FD_ISSET(fd, &exceptfds_)) { [delegate streamDidReceiveException: cArray[i]]; + [pool releaseObjects]; /* * Prevent calling it twice in case the fd is in both * sets. */ @@ -413,15 +420,19 @@ count = [writeStreams count]; for (i = 0; i < count; i++) { int fd = [cArray[i] fileDescriptor]; - if (FD_ISSET(fd, &writefds_)) + if (FD_ISSET(fd, &writefds_)) { [delegate streamDidBecomeReadyForWriting: cArray[i]]; + [pool releaseObjects]; + } - if (FD_ISSET(fd, &exceptfds_)) + if (FD_ISSET(fd, &exceptfds_)) { [delegate streamDidReceiveException: cArray[i]]; + [pool releaseObjects]; + } } #endif [pool release];