svn commit: r187693 - head/sys/kern

Jeff Roberson jroberson at jroberson.net
Sun Jan 25 10:59:18 PST 2009


On Sun, 25 Jan 2009, Jeff Roberson wrote:

> Author: jeff
> Date: Sun Jan 25 18:38:42 2009
> New Revision: 187693
> URL: http://svn.freebsd.org/changeset/base/187693
>
> Log:
>   - bit has to be fd_mask to work properly on 64bit platforms.  Constants
>     must also be cast even though the result ultimately is promoted
>     to 64bit.
>   - Correct a loop index upper bound in selscan().

Sorry about that, should've tested my earlier patch for more than a couple 
of days.  I seldom remember c's integer promotion rules as they relate to 
constants.  You'd think they'd make it easy on us and just promote it to 
the largest type in the expression/lvalue.  I'm not sure why they don't. 
Perhaps the more careful among you knows the answer.

Thanks,
Jeff

>
> Modified:
>  head/sys/kern/sys_generic.c
>
> Modified: head/sys/kern/sys_generic.c
> ==============================================================================
> --- head/sys/kern/sys_generic.c	Sun Jan 25 18:20:15 2009	(r187692)
> +++ head/sys/kern/sys_generic.c	Sun Jan 25 18:38:42 2009	(r187693)
> @@ -965,8 +965,8 @@ selrescan(struct thread *td, fd_mask **i
> 	struct selfd *sfp;
> 	struct selfd *sfn;
> 	struct file *fp;
> -	int fd, ev, n;
> -	int idx, bit;
> +	fd_mask bit;
> +	int fd, ev, n, idx;
>
> 	fdp = td->td_proc->p_fd;
> 	stp = td->td_sel;
> @@ -984,7 +984,7 @@ selrescan(struct thread *td, fd_mask **i
> 			return (EBADF);
> 		}
> 		idx = fd / NFDBITS;
> -		bit = 1 << (fd % NFDBITS);
> +		bit = (fd_mask)1 << (fd % NFDBITS);
> 		ev = fo_poll(fp, selflags(ibits, idx, bit), td->td_ucred, td);
> 		if (ev != 0)
> 			n += selsetbits(ibits, obits, idx, bit, ev);
> @@ -1007,13 +1007,14 @@ selscan(td, ibits, obits, nfd)
> {
> 	struct filedesc *fdp;
> 	struct file *fp;
> +	fd_mask bit;
> 	int ev, flags, end, fd;
> -	int n, idx, bit;
> +	int n, idx;
>
> 	fdp = td->td_proc->p_fd;
> 	n = 0;
> 	FILEDESC_SLOCK(fdp);
> -	for (idx = 0, fd = 0; idx < nfd; idx++) {
> +	for (idx = 0, fd = 0; fd < nfd; idx++) {
> 		end = imin(fd + NFDBITS, nfd);
> 		for (bit = 1; fd < end; bit <<= 1, fd++) {
> 			/* Compute the list of events we're interested in. */
>


More information about the svn-src-head mailing list