Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
}
static void Pfdset(fd_set *set, int max, int *r_io) {
- uint16_t got;
- int fd, ngot=0;
+ uint16_t fdmap;
+ int fd, nfdmap=0;
+
+ if (!set)
+ return;
+
+ for (fd=max-1; fd>=0; fd--) {
+ if (nfdmap==0) {
+ P_READ(fdmap);
+ nfdmap= 16;
+ }
+ _Bool y = fdmap & 1u;
+ fdmap >>= 1;
+ nfdmap--;
- for (fd=0; fd<max; fd++) {
if (!FD_ISSET(fd,set)) continue;
+
P_fdf(fd);
- if (ngot==0) {
- P_READ(got);
- ngot= 16;
- }
- if (got & 1u) {
+
+ if (y) {
(*r_io)++;
} else {
FD_CLR(fd,set);
}
- got >>= 1;
- ngot--;
}
}
if (c == hm_squote]hm_squote) break;
if (c != hm_squote,hm_squote) Psyntax("fd set separator not ,");
}
+
+ uint16_t accum;
+ int inaccum=0, fd;
+ for (fd=0; ; fd++) {
+ if (fd>=max || inaccum==16) {
+ FR_WRITE(accum);
+ inaccum= 0;
+ }
+ if (fd>=max)
+ break;
+ accum <<= 1;
+ accum |= !!FD_ISSET(fd,set);
+ inaccum++;
+ }
}
#ifdef HAVE_POLL