--- sys_generic.c.orig Tue Jun 19 00:37:08 2007 +++ sys_generic.c Fri Jun 22 09:59:50 2007 @@ -838,8 +838,8 @@ fd_mask **ibits, **obits; int nfd; { - int msk, i, fd; - fd_mask bits; + int msk, fd, mskoffset, mskbit; + unsigned char *cibits, *cobits; struct file *fp; int n = 0; /* Note: backend also returns POLLHUP/POLLERR if appropriate. */ @@ -850,25 +850,26 @@ for (msk = 0; msk < 3; msk++) { if (ibits[msk] == NULL) continue; - for (i = 0; i < nfd; i += NFDBITS) { - bits = ibits[msk][i/NFDBITS]; - /* ffs(int mask) not portable, fd_mask is long */ - for (fd = i; bits && fd < nfd; fd++, bits >>= 1) { - if (!(bits & 1)) - continue; + /* Treat fd_lists as arrays of unsigned char */ + cibits = (char *)ibits[msk][0]; + cobits = (char *)*obits; + for (mskbit=1, mskoffset = 0, fd = 0; fd < nfd; fd++) { + if ((cibits[mskoffset] & mskbit) != 0) { if ((fp = fget_locked(fdp, fd)) == NULL) { FILEDESC_UNLOCK(fdp); return (EBADF); } - if (fo_poll(fp, flag[msk], td->td_ucred, - td)) { - obits[msk][(fd)/NFDBITS] |= - ((fd_mask)1 << ((fd) % NFDBITS)); - n++; - } + /* Note: fo_poll is kqueue_poll in kern_event.c */ + if (fo_poll(fp, flag[msk], td->td_ucred, td)) + cobits[mskoffset] |= mskbit; + } + mskbit <<= 1; + if (mskbit > 0x80) { + mskbit = 1; + ++mskoffset; } } - } + } FILEDESC_UNLOCK(fdp); td->td_retval[0] = n; return (0);