static void pp_buffer_stderr(struct parallel_processes *pp, int output_timeout) { int i; while ((i = poll(pp->pfd, pp->max_processes, output_timeout)) < 0) { if (errno == EINTR) continue; pp_cleanup(pp); die_errno("poll"); } /* Buffer output from all pipes. */ for (i = 0; i < pp->max_processes; i++) { if (pp->children[i].state == GIT_CP_WORKING && pp->pfd[i].revents & (POLLIN | POLLHUP)) { int n = strbuf_read_once(&pp->children[i].err, pp->children[i].process.err, 0); if (n == 0) { close(pp->children[i].process.err); pp->children[i].state = GIT_CP_WAIT_CLEANUP; } else if (n < 0) if (errno != EAGAIN) die_errno("read"); } } }
static int pump_io_round(struct io_pump *slots, int nr, struct pollfd *pfd) { int pollsize = 0; int i; for (i = 0; i < nr; i++) { struct io_pump *io = &slots[i]; if (io->fd < 0) continue; pfd[pollsize].fd = io->fd; pfd[pollsize].events = io->type; io->pfd = &pfd[pollsize++]; } if (!pollsize) return 0; if (poll(pfd, pollsize, -1) < 0) { if (errno == EINTR) return 1; die_errno("poll failed"); } for (i = 0; i < nr; i++) { struct io_pump *io = &slots[i]; if (io->fd < 0) continue; if (!(io->pfd->revents & (POLLOUT|POLLIN|POLLHUP|POLLERR|POLLNVAL))) continue; if (io->type == POLLOUT) { ssize_t len = xwrite(io->fd, io->u.out.buf, io->u.out.len); if (len < 0) { io->error = errno; close(io->fd); io->fd = -1; } else { io->u.out.buf += len; io->u.out.len -= len; if (!io->u.out.len) { close(io->fd); io->fd = -1; } } } if (io->type == POLLIN) { ssize_t len = strbuf_read_once(io->u.in.buf, io->fd, io->u.in.hint); if (len < 0) io->error = errno; if (len <= 0) { close(io->fd); io->fd = -1; } } } return 1; }