version 1.18, 2001/03/03 06:53:12 |
version 1.19, 2001/03/03 21:19:41 |
|
|
#define MAXCON (maxfd - 10) |
#define MAXCON (maxfd - 10) |
|
|
extern char *__progname; |
extern char *__progname; |
fd_set read_wait; |
fd_set *read_wait; |
|
size_t read_wait_size; |
int ncon; |
int ncon; |
|
|
/* |
/* |
|
|
gettimeofday(&fdcon[s].c_tv, NULL); |
gettimeofday(&fdcon[s].c_tv, NULL); |
fdcon[s].c_tv.tv_sec += timeout; |
fdcon[s].c_tv.tv_sec += timeout; |
TAILQ_INSERT_TAIL(&tq, &fdcon[s], c_link); |
TAILQ_INSERT_TAIL(&tq, &fdcon[s], c_link); |
FD_SET(s, &read_wait); |
FD_SET(s, read_wait); |
ncon++; |
ncon++; |
return (s); |
return (s); |
} |
} |
|
|
xfree(fdcon[s].c_data); |
xfree(fdcon[s].c_data); |
fdcon[s].c_status = CS_UNUSED; |
fdcon[s].c_status = CS_UNUSED; |
TAILQ_REMOVE(&tq, &fdcon[s], c_link); |
TAILQ_REMOVE(&tq, &fdcon[s], c_link); |
FD_CLR(s, &read_wait); |
FD_CLR(s, read_wait); |
ncon--; |
ncon--; |
} |
} |
|
|
|
|
void |
void |
conloop(void) |
conloop(void) |
{ |
{ |
fd_set r, e; |
fd_set *r, *e; |
struct timeval seltime, now; |
struct timeval seltime, now; |
int i; |
int i; |
con *c; |
con *c; |
|
|
} else |
} else |
seltime.tv_sec = seltime.tv_usec = 0; |
seltime.tv_sec = seltime.tv_usec = 0; |
|
|
r = e = read_wait; |
r = xmalloc(read_wait_size); |
while (select(maxfd, &r, NULL, &e, &seltime) == -1 && |
memcpy(r, read_wait, read_wait_size); |
|
e = xmalloc(read_wait_size); |
|
memcpy(e, read_wait, read_wait_size); |
|
|
|
while (select(maxfd, r, NULL, e, &seltime) == -1 && |
(errno == EAGAIN || errno == EINTR)) |
(errno == EAGAIN || errno == EINTR)) |
; |
; |
|
|
for (i = 0; i < maxfd; i++) { |
for (i = 0; i < maxfd; i++) { |
if (FD_ISSET(i, &e)) { |
if (FD_ISSET(i, e)) { |
error("%s: exception!", fdcon[i].c_name); |
error("%s: exception!", fdcon[i].c_name); |
confree(i); |
confree(i); |
} else if (FD_ISSET(i, &r)) |
} else if (FD_ISSET(i, r)) |
conread(i); |
conread(i); |
} |
} |
|
xfree(r); |
|
xfree(e); |
|
|
c = tq.tqh_first; |
c = tq.tqh_first; |
while (c && (c->c_tv.tv_sec < now.tv_sec || |
while (c && (c->c_tv.tv_sec < now.tv_sec || |
|
|
fdlim_set(maxfd); |
fdlim_set(maxfd); |
fdcon = xmalloc(maxfd * sizeof(con)); |
fdcon = xmalloc(maxfd * sizeof(con)); |
memset(fdcon, 0, maxfd * sizeof(con)); |
memset(fdcon, 0, maxfd * sizeof(con)); |
|
|
|
read_wait_size = howmany(maxfd, NFDBITS) * sizeof(fd_mask); |
|
read_wait = xmalloc(read_wait_size); |
|
memset(read_wait, 0, read_wait_size); |
|
|
do { |
do { |
while (ncon < MAXCON) { |
while (ncon < MAXCON) { |