int link_poll(struct link_info *links, int nlinks, int msec) { struct pollfd *fds = malloc(nlinks * sizeof(struct pollfd)); int i; int result; memset(fds, 0, nlinks * sizeof(struct pollfd)); for(i = 0; i < nlinks; i++) { fds[i].fd = links[i].link->fd; fds[i].events = link_to_poll(links[i].events); } result = poll(fds, nlinks, msec); if(result >= 0) { for(i = 0; i < nlinks; i++) { links[i].revents = poll_to_link(fds[i].revents); } } free(fds); return result; }
int link_poll(struct link_info *links, int nlinks, int msec) { struct pollfd *fds = malloc(nlinks * sizeof(struct pollfd)); int i; int result; memset(fds, 0, nlinks * sizeof(struct pollfd)); for(i = 0; i < nlinks; i++) { fds[i].fd = links[i].link->fd; fds[i].events = link_to_poll(links[i].events); if(links[i].link->buffer_length) { // If there's data already waiting, don't sit in the poll msec = 0; } } result = poll(fds, nlinks, msec); if(result >= 0) { for(i = 0; i < nlinks; i++) { links[i].revents = poll_to_link(fds[i].revents); if(links[i].link->buffer_length) { links[i].revents |= LINK_READ; result++; } } } free(fds); return result; }