2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-09-03 16:15:27 +00:00

handle manager->maxfd somewhat well -- it'll grow, but never shrink, yet.

This commit is contained in:
Michael Graff
1998-11-11 01:44:08 +00:00
parent 3d8e572880
commit 28866ad778

View File

@@ -1,4 +1,4 @@
/* $Id: socket.c,v 1.6 1998/11/11 00:43:13 explorer Exp $ */ /* $Id: socket.c,v 1.7 1998/11/11 01:44:08 explorer Exp $ */
#include "attribute.h" #include "attribute.h"
@@ -110,6 +110,7 @@ struct isc_socketmgr {
fd_set read_fds; fd_set read_fds;
fd_set write_fds; fd_set write_fds;
isc_socket_t fds[FD_SETSIZE]; isc_socket_t fds[FD_SETSIZE];
int maxfd;
int pipe_fds[2]; int pipe_fds[2];
sig_atomic_t pipe_msgs; sig_atomic_t pipe_msgs;
}; };
@@ -263,6 +264,10 @@ destroy(isc_socket_t *sockp)
manager->fds[sock->fd] = NULL; manager->fds[sock->fd] = NULL;
manager->nsockets--; manager->nsockets--;
/*
* XXX should reset manager->maxfd here
*/
UNLOCK(&manager->lock); UNLOCK(&manager->lock);
free_socket(sockp); free_socket(sockp);
@@ -412,6 +417,8 @@ isc_socket_create(isc_socketmgr_t manager, isc_sockettype_t type,
manager->fds[sock->fd] = sock; manager->fds[sock->fd] = sock;
manager->nsockets++; manager->nsockets++;
if (manager->maxfd < sock->fd)
manager->maxfd = sock->fd;
UNLOCK(&manager->lock); UNLOCK(&manager->lock);
@@ -666,6 +673,8 @@ internal_accept(isc_task_t task, isc_event_t ev)
*/ */
LOCK(&sock->manager->lock); LOCK(&sock->manager->lock);
sock->manager->fds[fd] = dev->newsocket; sock->manager->fds[fd] = dev->newsocket;
if (sock->manager->maxfd < fd)
sock->manager->maxfd = fd;
UNLOCK(&sock->manager->lock); UNLOCK(&sock->manager->lock);
send_ncdone_event(sock, &iev, &dev, ISC_R_SUCCESS); send_ncdone_event(sock, &iev, &dev, ISC_R_SUCCESS);
@@ -977,6 +986,7 @@ watcher(void *uap)
int i; int i;
isc_socket_intev_t iev; isc_socket_intev_t iev;
isc_socket_ncintev_t nciev; isc_socket_ncintev_t nciev;
int maxfd;
/* /*
* Get the control fd here. This will never change. * Get the control fd here. This will never change.
@@ -989,11 +999,14 @@ watcher(void *uap)
do { do {
readfds = manager->read_fds; readfds = manager->read_fds;
writefds = manager->write_fds; writefds = manager->write_fds;
maxfd = manager->maxfd + 1;
UNLOCK(&manager->lock); UNLOCK(&manager->lock);
cc = select(FD_SETSIZE, &readfds, &writefds, NULL, cc = select(maxfd, &readfds, &writefds, NULL,
NULL); NULL);
XTRACE(("select(%d, ...) == %d, errno %d\n",
maxfd, cc, errno));
if (cc < 0) { if (cc < 0) {
if (errno != EINTR) if (errno != EINTR)
UNEXPECTED_ERROR(__FILE__, __LINE__, UNEXPECTED_ERROR(__FILE__, __LINE__,
@@ -1085,7 +1098,7 @@ watcher(void *uap)
* Process read/writes on other fds here. Avoid locking * Process read/writes on other fds here. Avoid locking
* and unlocking twice if both reads and writes are possible. * and unlocking twice if both reads and writes are possible.
*/ */
for (i = 0 ; i < FD_SETSIZE ; i++) { for (i = 0 ; i < maxfd ; i++) {
if (manager->fds[i] != NULL) { if (manager->fds[i] != NULL) {
sock = manager->fds[i]; sock = manager->fds[i];
unlock_sock = ISC_FALSE; unlock_sock = ISC_FALSE;
@@ -1172,6 +1185,7 @@ isc_socketmgr_create(isc_memctx_t mctx, isc_socketmgr_t *managerp)
FD_ZERO(&manager->read_fds); FD_ZERO(&manager->read_fds);
FD_ZERO(&manager->write_fds); FD_ZERO(&manager->write_fds);
FD_SET(manager->pipe_fds[0], &manager->read_fds); FD_SET(manager->pipe_fds[0], &manager->read_fds);
manager->maxfd = manager->pipe_fds[0];
/* /*
* Start up the select/poll thread. * Start up the select/poll thread.