version 1.103, 2012/03/09 09:57:40 |
version 1.104, 2012/04/11 06:16:14 |
|
|
} |
} |
cfg_finished = 1; |
cfg_finished = 1; |
|
|
event_set(&server_ev_accept, |
server_add_accept(0); |
server_fd, EV_READ|EV_PERSIST, server_accept_callback, NULL); |
|
event_add(&server_ev_accept, NULL); |
|
|
|
memset(&tv, 0, sizeof tv); |
memset(&tv, 0, sizeof tv); |
tv.tv_sec = 1; |
tv.tv_sec = 1; |
|
|
socklen_t slen = sizeof sa; |
socklen_t slen = sizeof sa; |
int newfd; |
int newfd; |
|
|
|
server_add_accept(0); |
if (!(events & EV_READ)) |
if (!(events & EV_READ)) |
return; |
return; |
|
|
|
|
if (newfd == -1) { |
if (newfd == -1) { |
if (errno == EAGAIN || errno == EINTR || errno == ECONNABORTED) |
if (errno == EAGAIN || errno == EINTR || errno == ECONNABORTED) |
return; |
return; |
|
if (errno == ENFILE || errno == EMFILE) { |
|
/* Delete and don't try again for 1 second. */ |
|
server_add_accept(1); |
|
return; |
|
} |
fatal("accept failed"); |
fatal("accept failed"); |
} |
} |
if (server_shutdown) { |
if (server_shutdown) { |
|
|
server_client_create(newfd); |
server_client_create(newfd); |
} |
} |
|
|
|
/* |
|
* Add accept event. If timeout is nonzero, add as a timeout instead of a read |
|
* event - used to backoff when running out of file descriptors. |
|
*/ |
|
void |
|
server_add_accept(int timeout) |
|
{ |
|
struct timeval tv = { timeout, 0 }; |
|
|
|
if (event_initialized(&server_ev_accept)) |
|
event_del(&server_ev_accept); |
|
|
|
if (timeout == 0) { |
|
event_set(&server_ev_accept, |
|
server_fd, EV_READ, server_accept_callback, NULL); |
|
event_add(&server_ev_accept, NULL); |
|
} else { |
|
event_set(&server_ev_accept, |
|
server_fd, EV_TIMEOUT, server_accept_callback, NULL); |
|
event_add(&server_ev_accept, &tv); |
|
} |
|
} |
|
|
/* Signal handler. */ |
/* Signal handler. */ |
/* ARGSUSED */ |
/* ARGSUSED */ |
void |
void |
|
|
event_del(&server_ev_accept); |
event_del(&server_ev_accept); |
close(server_fd); |
close(server_fd); |
server_fd = server_create_socket(); |
server_fd = server_create_socket(); |
event_set(&server_ev_accept, server_fd, |
server_add_accept(0); |
EV_READ|EV_PERSIST, server_accept_callback, NULL); |
|
event_add(&server_ev_accept, NULL); |
|
break; |
break; |
} |
} |
} |
} |