// Return 1 for success, 0 for remote closed, -1 for error including EAGAIN int wait_for_returned_buffers(struct shmem_pipe_handle_conn *sp) { int r; int s; static int total_read; s = read(sp->base.fd, sp->rx_buf + sp->rx_buf_prod, sizeof(sp->rx_buf) - sp->rx_buf_prod); if (s <= 0) { if(errno == ECONNRESET) errno = 0; return s; } total_read += s; sp->rx_buf_prod += s; for (r = 0; r < sp->rx_buf_prod / sizeof(struct extent); r++) { struct extent *e = &((struct extent *)sp->rx_buf)[r]; release_shared_space(sp, e->base, e->size); } if (sp->rx_buf_prod != r * sizeof(struct extent)) memmove(sp->rx_buf, sp->rx_buf + sp->rx_buf_prod - (sp->rx_buf_prod % sizeof(struct extent)), sp->rx_buf_prod % sizeof(struct extent)); sp->rx_buf_prod %= sizeof(struct extent); return 1; }
static void wait_for_returned_buffers(struct shmem_pipe *sp) { int r; int s; static int total_read; s = read(sp->child_to_parent_read, sp->rx_buf + sp->rx_buf_prod, sizeof(sp->rx_buf) - sp->rx_buf_prod); if (s < 0) err(1, "error reading in parent"); total_read += s; sp->rx_buf_prod += s; for (r = 0; r < sp->rx_buf_prod / sizeof(struct extent); r++) { struct extent *e = &((struct extent *)sp->rx_buf)[r]; release_shared_space(sp, e->base, e->size); } if (sp->rx_buf_prod != r * sizeof(struct extent)) memmove(sp->rx_buf, sp->rx_buf + sp->rx_buf_prod - (sp->rx_buf_prod % sizeof(struct extent)), sp->rx_buf_prod % sizeof(struct extent)); sp->rx_buf_prod %= sizeof(struct extent); }