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
;