From: Evan Martin Date: Wed, 1 Dec 2010 20:37:32 +0000 (-0800) Subject: don't leak fds X-Git-Tag: release-120715~594 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=2e63f5183171d8d183993715417277498d2658ef;p=platform%2Fupstream%2Fninja.git don't leak fds --- diff --git a/subprocess.cc b/subprocess.cc index ab72758..7bf4fc3 100644 --- a/subprocess.cc +++ b/subprocess.cc @@ -114,38 +114,39 @@ void SubprocessSet::Add(Subprocess* subprocess) { } void SubprocessSet::DoWork() { - struct pollfd* fds = new pollfd[running_.size() * 2]; + vector fds; map fd_to_subprocess; - int fds_count = 0; for (vector::iterator i = running_.begin(); i != running_.end(); ++i) { int fd = (*i)->stdout_.fd_; if (fd >= 0) { fd_to_subprocess[fd] = *i; - fds[fds_count].fd = fd; - fds[fds_count].events = POLLIN; - fds[fds_count].revents = 0; - ++fds_count; + fds.resize(fds.size() + 1); + pollfd* newfd = &fds.back(); + newfd->fd = fd; + newfd->events = POLLIN; + newfd->revents = 0; } fd = (*i)->stderr_.fd_; if (fd >= 0) { fd_to_subprocess[fd] = *i; - fds[fds_count].fd = fd; - fds[fds_count].events = POLLIN; - fds[fds_count].revents = 0; - ++fds_count; + fds.resize(fds.size() + 1); + pollfd* newfd = &fds.back(); + newfd->fd = fd; + newfd->events = POLLIN; + newfd->revents = 0; } } - int ret = poll(fds, fds_count, -1); + int ret = poll(fds.data(), fds.size(), -1); if (ret == -1) { if (errno != EINTR) perror("poll"); return; } - for (int i = 0; i < fds_count; ++i) { + for (size_t i = 0; i < fds.size(); ++i) { if (fds[i].revents) { Subprocess* subproc = fd_to_subprocess[fds[i].fd]; if (fds[i].revents) {