5
void iopause(iopause_fd *x,unsigned int len,struct taia *deadline,struct taia *stamp)
12
if (taia_less(deadline,stamp))
16
taia_sub(&t,deadline,&t);
18
if (d > 1000.0) d = 1000.0;
19
millisecs = d * 1000.0 + 20.0;
22
for (i = 0;i < len;++i)
27
poll(x,len,millisecs);
28
/* XXX: some kernels apparently need x[0] even if len is 0 */
29
/* XXX: how to handle EAGAIN? are kernels really this dumb? */
30
/* XXX: how to handle EINVAL? when exactly can this happen? */
45
for (i = 0;i < len;++i) {
48
if (fd >= 8 * sizeof(fd_set)) continue; /*XXX*/
50
if (fd >= nfds) nfds = fd + 1;
51
if (x[i].events & IOPAUSE_READ) FD_SET(fd,&rfds);
52
if (x[i].events & IOPAUSE_WRITE) FD_SET(fd,&wfds);
55
tv.tv_sec = millisecs / 1000;
56
tv.tv_usec = 1000 * (millisecs % 1000);
58
if (select(nfds,&rfds,&wfds,(fd_set *) 0,&tv) <= 0)
60
/* XXX: for EBADF, could seek out and destroy the bad descriptor */
62
for (i = 0;i < len;++i) {
65
if (fd >= 8 * sizeof(fd_set)) continue; /*XXX*/
67
if (x[i].events & IOPAUSE_READ)
68
if (FD_ISSET(fd,&rfds)) x[i].revents |= IOPAUSE_READ;
69
if (x[i].events & IOPAUSE_WRITE)
70
if (FD_ISSET(fd,&wfds)) x[i].revents |= IOPAUSE_WRITE;