Remove the kernel FD_SETSIZE limit for select().
Make select()'s first argument 'int' not 'u_int'. Reviewed by: bde
This commit is contained in:
parent
9f3816ea5d
commit
b08f7993c3
@ -36,7 +36,7 @@
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)kern_exit.c 8.7 (Berkeley) 2/12/94
|
||||
* $Id: kern_exit.c,v 1.35 1996/07/30 03:08:37 dyson Exp $
|
||||
* $Id: kern_exit.c,v 1.36 1996/08/19 02:28:23 julian Exp $
|
||||
*/
|
||||
|
||||
#include "opt_ktrace.h"
|
||||
@ -159,6 +159,12 @@ exit1(p, rv)
|
||||
*/
|
||||
fdfree(p);
|
||||
|
||||
/*
|
||||
* Delete select() buffers
|
||||
*/
|
||||
if (p->p_selbits)
|
||||
free (p->p_selbits, M_SELECT);
|
||||
|
||||
/*
|
||||
* XXX Shutdown SYSV semaphores
|
||||
*/
|
||||
|
@ -36,7 +36,7 @@
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)sys_generic.c 8.5 (Berkeley) 1/21/94
|
||||
* $Id: sys_generic.c,v 1.17 1995/12/14 08:31:48 phk Exp $
|
||||
* $Id: sys_generic.c,v 1.18 1996/01/03 21:42:17 wollman Exp $
|
||||
*/
|
||||
|
||||
#include "opt_ktrace.h"
|
||||
@ -61,7 +61,7 @@
|
||||
#endif
|
||||
#include <vm/vm.h>
|
||||
|
||||
static int selscan __P((struct proc *, fd_set *, fd_set *, int, int *));
|
||||
static int selscan __P((struct proc *, fd_mask **, fd_mask **, int, int *));
|
||||
|
||||
/*
|
||||
* Read system call.
|
||||
@ -516,7 +516,7 @@ int selwait;
|
||||
*/
|
||||
#ifndef _SYS_SYSPROTO_H_
|
||||
struct select_args {
|
||||
u_int nd;
|
||||
int nd;
|
||||
fd_set *in, *ou, *ex;
|
||||
struct timeval *tv;
|
||||
};
|
||||
@ -527,22 +527,49 @@ select(p, uap, retval)
|
||||
register struct select_args *uap;
|
||||
int *retval;
|
||||
{
|
||||
fd_set ibits[3], obits[3];
|
||||
fd_mask *ibits[3], *obits[3];
|
||||
struct timeval atv;
|
||||
int s, ncoll, error = 0, timo;
|
||||
int s, ncoll, error = 0, timo, i;
|
||||
u_int ni;
|
||||
|
||||
bzero((caddr_t)ibits, sizeof(ibits));
|
||||
bzero((caddr_t)obits, sizeof(obits));
|
||||
if (uap->nd > FD_SETSIZE)
|
||||
return (EINVAL);
|
||||
if (uap->nd < 0)
|
||||
return EINVAL;
|
||||
|
||||
if (uap->nd > p->p_fd->fd_nfiles)
|
||||
uap->nd = p->p_fd->fd_nfiles; /* forgiving; slightly wrong */
|
||||
uap->nd = p->p_fd->fd_nfiles; /* forgiving; slightly wrong */
|
||||
|
||||
/* The amount of space we need to allocate */
|
||||
ni = howmany(roundup2 (uap->nd, FD_SETSIZE), NFDBITS) *
|
||||
sizeof(fd_mask);
|
||||
|
||||
if (ni > p->p_selbits_size) {
|
||||
if (p->p_selbits_size)
|
||||
free (p->p_selbits, M_SELECT);
|
||||
|
||||
while (p->p_selbits_size < ni)
|
||||
p->p_selbits_size += 32; /* Increase by 256 bits */
|
||||
|
||||
p->p_selbits = malloc(p->p_selbits_size * 6, M_SELECT,
|
||||
M_WAITOK);
|
||||
}
|
||||
for (i = 0; i < 3; i++) {
|
||||
ibits[i] = (fd_mask *)(p->p_selbits + i * p->p_selbits_size);
|
||||
obits[i] = (fd_mask *)(p->p_selbits + (i + 3) *
|
||||
p->p_selbits_size);
|
||||
}
|
||||
|
||||
/*
|
||||
* This buffer is usually very small therefore it's probably faster
|
||||
* to just zero it, rather than calculate what needs to be zeroed.
|
||||
*/
|
||||
bzero (p->p_selbits, p->p_selbits_size * 6);
|
||||
|
||||
/* The amount of space we need to copyin/copyout */
|
||||
ni = howmany(uap->nd, NFDBITS) * sizeof(fd_mask);
|
||||
|
||||
#define getbits(name, x) \
|
||||
if (uap->name && \
|
||||
(error = copyin((caddr_t)uap->name, (caddr_t)&ibits[x], ni))) \
|
||||
(error = copyin((caddr_t)uap->name, (caddr_t)ibits[x], ni))) \
|
||||
goto done;
|
||||
getbits(in, 0);
|
||||
getbits(ou, 1);
|
||||
@ -600,7 +627,7 @@ done:
|
||||
error = 0;
|
||||
#define putbits(name, x) \
|
||||
if (uap->name && \
|
||||
(error2 = copyout((caddr_t)&obits[x], (caddr_t)uap->name, ni))) \
|
||||
(error2 = copyout((caddr_t)obits[x], (caddr_t)uap->name, ni))) \
|
||||
error = error2;
|
||||
if (error == 0) {
|
||||
int error2;
|
||||
@ -616,7 +643,7 @@ done:
|
||||
static int
|
||||
selscan(p, ibits, obits, nfd, retval)
|
||||
struct proc *p;
|
||||
fd_set *ibits, *obits;
|
||||
fd_mask **ibits, **obits;
|
||||
int nfd, *retval;
|
||||
{
|
||||
register struct filedesc *fdp = p->p_fd;
|
||||
@ -628,14 +655,15 @@ selscan(p, ibits, obits, nfd, retval)
|
||||
|
||||
for (msk = 0; msk < 3; msk++) {
|
||||
for (i = 0; i < nfd; i += NFDBITS) {
|
||||
bits = ibits[msk].fds_bits[i/NFDBITS];
|
||||
bits = ibits[msk][i/NFDBITS];
|
||||
while ((j = ffs(bits)) && (fd = i + --j) < nfd) {
|
||||
bits &= ~(1 << j);
|
||||
fp = fdp->fd_ofiles[fd];
|
||||
if (fp == NULL)
|
||||
return (EBADF);
|
||||
if ((*fp->f_ops->fo_select)(fp, flag[msk], p)) {
|
||||
FD_SET(fd, &obits[msk]);
|
||||
obits[msk][(fd)/NFDBITS] |=
|
||||
(1 << ((fd) % NFDBITS));
|
||||
n++;
|
||||
}
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
$Id: syscalls.master,v 1.26 1996/02/23 18:20:44 peter Exp $
|
||||
$Id: syscalls.master,v 1.27 1996/03/02 16:51:25 peter Exp $
|
||||
; from: @(#)syscalls.master 8.2 (Berkeley) 1/13/94
|
||||
;
|
||||
; System call name/number master file.
|
||||
@ -152,7 +152,7 @@
|
||||
; XXX should be { int fcntl(int fd, int cmd, ...); }
|
||||
; but we're not ready for varargs.
|
||||
; XXX man page says `int arg' too.
|
||||
93 STD BSD { int select(u_int nd, fd_set *in, fd_set *ou, \
|
||||
93 STD BSD { int select(int nd, fd_set *in, fd_set *ou, \
|
||||
fd_set *ex, struct timeval *tv); }
|
||||
94 UNIMPL BSD setdopt
|
||||
95 STD POSIX { int fsync(int fd); }
|
||||
|
@ -31,7 +31,7 @@
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)malloc.h 8.5 (Berkeley) 5/3/95
|
||||
* $Id: malloc.h,v 1.14 1996/06/14 17:22:18 wollman Exp $
|
||||
* $Id: malloc.h,v 1.15 1996/08/04 20:12:57 phk Exp $
|
||||
*/
|
||||
|
||||
#ifndef _SYS_MALLOC_H_
|
||||
@ -128,7 +128,8 @@
|
||||
#define M_SECA 81 /* security associations, key management */
|
||||
#define M_BIOBUF 82 /* BIO buffer */
|
||||
#define M_KTRACE 83 /* KTRACE */
|
||||
#define M_LAST 84 /* Must be last type + 1 */
|
||||
#define M_SELECT 84 /* select() buffer */
|
||||
#define M_LAST 85 /* Must be last type + 1 */
|
||||
|
||||
#define INITKMEMNAMES { \
|
||||
"free", /* 0 M_FREE */ \
|
||||
@ -212,6 +213,7 @@
|
||||
"key mgmt", /* 81 M_SECA */ \
|
||||
"BIO buffer", /* 82 M_BIOBUF */ \
|
||||
"KTRACE", /* 83 M_KTRACE */ \
|
||||
"select", /* 84 M_SELECT */ \
|
||||
}
|
||||
|
||||
struct kmemstats {
|
||||
|
@ -36,7 +36,7 @@
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)proc.h 8.15 (Berkeley) 5/19/95
|
||||
* $Id: proc.h,v 1.25 1996/06/09 15:00:11 alex Exp $
|
||||
* $Id: proc.h,v 1.26 1996/07/31 09:26:54 davidg Exp $
|
||||
*/
|
||||
|
||||
#ifndef _SYS_PROC_H_
|
||||
@ -138,6 +138,9 @@ struct proc {
|
||||
char p_lock; /* Process lock (prevent swap) count. */
|
||||
char p_pad2[3]; /* alignment */
|
||||
|
||||
char *p_selbits; /* For select(), bits */
|
||||
u_int p_selbits_size; /* For select(), fd_set size (bytes) */
|
||||
|
||||
short p_locks; /* DEBUG: lockmgr count of held locks */
|
||||
short p_simple_locks; /* DEBUG: count of held simple locks */
|
||||
|
||||
|
@ -326,7 +326,7 @@ struct fcntl_args {
|
||||
int arg;
|
||||
};
|
||||
struct select_args {
|
||||
u_int nd;
|
||||
int nd;
|
||||
fd_set * in;
|
||||
fd_set * ou;
|
||||
fd_set * ex;
|
||||
|
Loading…
x
Reference in New Issue
Block a user