8 void pollwait(Ufile
*f
, Uwaitq
*q
, void *t
)
12 if(f
== nil
|| t
== nil
|| q
== nil
)
40 int sys_poll(void *p
, int nfd
, long timeout
)
46 struct linux_pollfd
*fds
= p
;
48 trace("sys_poll(%p, %d, %ld)", p
, nfd
, timeout
);
57 if(current
->restart
->syscall
){
58 t
= current
->restart
->poll
.timeout
;
60 t
= now
+ timeout
*1000000LL;
77 if(file
= fdgetfile(fds
[i
].fd
)){
78 if(devtab
[file
->dev
]->poll
== nil
){
81 e
= devtab
[file
->dev
]->poll(file
, (err
== 0) ? &tab
: nil
);
84 e
&= fds
[i
].events
| POLLERR
| POLLHUP
;
87 if(fds
[i
].revents
= e
){
88 trace("sys_poll(): fd %d is ready with %x", fds
[i
].fd
, fds
[i
].revents
);
94 if(timeout
>= 0 && current
->timeout
== 0){
95 trace("sys_poll(): timeout");
98 if((err
= sleepproc(nil
, 1)) < 0){
99 trace("sys_poll(): interrupted");
100 current
->restart
->poll
.timeout
= t
;
108 current
->timeout
= 0;
113 int sys_select(int nfd
, ulong
*rfd
, ulong
*wfd
, ulong
*efd
, void *ptv
)
115 int i
, p
, e
, w
, nwrd
, nbits
, fd
, err
;
120 struct linux_timeval
*tv
= ptv
;
126 trace("sys_select(%d, %p, %p, %p, %p)", nfd
, rfd
, wfd
, efd
, ptv
);
132 if(tv
->tv_sec
< 0 || tv
->tv_usec
< 0 || tv
->tv_usec
>= 1000000)
135 nwrd
= (nfd
+ (8 * sizeof(m
))-1) / (8 * sizeof(m
));
138 for(w
=0; w
<nwrd
; w
++)
140 if((rfd
&& rfd
[w
] & m
) || (wfd
&& wfd
[w
] & m
) || (efd
&& efd
[w
] & m
))
143 if(nbits
> nelem(astk
)){
144 ardy
= kmalloc(nbits
* sizeof(ardy
[0]));
153 if(current
->restart
->syscall
){
154 t
= current
->restart
->select
.timeout
;
156 t
= now
+ tv
->tv_sec
*1000000000LL + tv
->tv_usec
*1000;
159 current
->timeout
= t
;
170 for(w
=0; w
<nwrd
; w
++){
171 for(m
=1; m
; m
<<=1, fd
++){
173 if(rfd
&& rfd
[w
] & m
)
175 if(wfd
&& wfd
[w
] & m
)
177 if(efd
&& efd
[w
] & m
)
179 if(!p
|| ((file
= fdgetfile(fd
)) == nil
))
181 if(devtab
[file
->dev
]->poll
== nil
){
184 e
= devtab
[file
->dev
]->poll(file
, (err
== 0) ? &tab
: nil
);
197 if(tv
!= nil
&& current
->timeout
== 0){
198 trace("sys_select(): timeout");
201 if((err
= sleepproc(nil
, 1)) < 0){
202 trace("sys_select(): interrupted");
203 current
->restart
->select
.timeout
= t
;
211 current
->timeout
= 0;
215 tv
->tv_sec
= (long)(t
/1000000000LL);
216 tv
->tv_usec
= (long)((t%1000000000LL
)/1000);
220 if(rfd
) memset(rfd
, 0, nwrd
*sizeof(m
));
221 if(wfd
) memset(wfd
, 0, nwrd
*sizeof(m
));
222 if(efd
) memset(efd
, 0, nwrd
*sizeof(m
));
225 for(i
=0; i
<err
; i
++){
228 w
= fd
/ (8 * sizeof(m
));
229 m
= 1 << (fd
% (8 * sizeof(m
)));
230 if(rfd
&& (e
& POLLIN
)){
234 if(wfd
&& (e
& POLLOUT
)){
238 if(efd
&& (e
& POLLERR
)){