|
|
|
@ -94,6 +94,7 @@ static volatile sig_atomic_t srv_shutdown = 0;
|
|
|
|
|
static volatile sig_atomic_t handle_sig_child = 0; |
|
|
|
|
static volatile sig_atomic_t handle_sig_alarm = 1; |
|
|
|
|
static volatile sig_atomic_t handle_sig_hup = 0; |
|
|
|
|
static time_t idle_limit = 0; |
|
|
|
|
|
|
|
|
|
#if defined(HAVE_SIGACTION) && defined(SA_SIGINFO) |
|
|
|
|
static volatile siginfo_t last_sigterm_info; |
|
|
|
@ -983,7 +984,6 @@ static int server_main (server * const srv, int argc, char **argv) {
|
|
|
|
|
int num_childs = 0; |
|
|
|
|
#endif |
|
|
|
|
size_t i; |
|
|
|
|
time_t idle_limit = 0, last_active_ts = time(NULL); |
|
|
|
|
#ifdef HAVE_SIGACTION |
|
|
|
|
struct sigaction act; |
|
|
|
|
#endif |
|
|
|
@ -1003,6 +1003,7 @@ static int server_main (server * const srv, int argc, char **argv) {
|
|
|
|
|
graceful_shutdown = 0; |
|
|
|
|
handle_sig_alarm = 1; |
|
|
|
|
handle_sig_hup = 0; |
|
|
|
|
idle_limit = 0; |
|
|
|
|
chunkqueue_set_tempdirs_default_reset(); |
|
|
|
|
http_auth_dumbdata_reset(); |
|
|
|
|
http_vhostdb_dumbdata_reset(); |
|
|
|
@ -1727,19 +1728,13 @@ static int server_main (server * const srv, int argc, char **argv) {
|
|
|
|
|
oneshot_fd = -1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* main-loop */ |
|
|
|
|
while (!srv_shutdown) { |
|
|
|
|
int n; |
|
|
|
|
size_t ndx; |
|
|
|
|
time_t min_ts; |
|
|
|
|
return 1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (handle_sig_hup) { |
|
|
|
|
__attribute_noinline__ |
|
|
|
|
static int server_handle_sighup (server * const srv) { |
|
|
|
|
handler_t r; |
|
|
|
|
|
|
|
|
|
/* reset notification */ |
|
|
|
|
handle_sig_hup = 0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* cycle logfiles */ |
|
|
|
|
|
|
|
|
|
switch(r = plugins_call_handle_sighup(srv)) { |
|
|
|
@ -1766,23 +1761,12 @@ static int server_main (server * const srv, int argc, char **argv) {
|
|
|
|
|
"logfiles cycled"); |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (handle_sig_alarm) { |
|
|
|
|
/* a new second */ |
|
|
|
|
|
|
|
|
|
#ifdef USE_ALARM |
|
|
|
|
/* reset notification */ |
|
|
|
|
handle_sig_alarm = 0; |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
/* get current time */ |
|
|
|
|
min_ts = time(NULL); |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (min_ts != srv->cur_ts) { |
|
|
|
|
#ifdef DEBUG_CONNECTION_STATES |
|
|
|
|
int cs = 0; |
|
|
|
|
#endif |
|
|
|
|
__attribute_noinline__ |
|
|
|
|
static void server_handle_sigalrm (server * const srv, time_t min_ts, time_t last_active_ts) { |
|
|
|
|
connections *conns = srv->conns; |
|
|
|
|
handler_t r; |
|
|
|
|
|
|
|
|
@ -1825,7 +1809,7 @@ static int server_main (server * const srv, int argc, char **argv) {
|
|
|
|
|
/* cleanup stat-cache */ |
|
|
|
|
stat_cache_trigger_cleanup(srv); |
|
|
|
|
/* reset global/aggregate rate limit counters */ |
|
|
|
|
for (i = 0; i < srv->config_context->used; ++i) { |
|
|
|
|
for (size_t i = 0; i < srv->config_context->used; ++i) { |
|
|
|
|
srv->config_storage[i]->global_bytes_per_second_cnt = 0; |
|
|
|
|
} |
|
|
|
|
/* if graceful_shutdown, accelerate cleanup of recently completed request/responses */ |
|
|
|
@ -1834,7 +1818,7 @@ static int server_main (server * const srv, int argc, char **argv) {
|
|
|
|
|
* check all connections for timeouts |
|
|
|
|
* |
|
|
|
|
*/ |
|
|
|
|
for (ndx = 0; ndx < conns->used; ndx++) { |
|
|
|
|
for (size_t ndx = 0; ndx < conns->used; ++ndx) { |
|
|
|
|
connection * const con = conns->ptr[ndx]; |
|
|
|
|
const int waitevents = fdevent_event_get_interest(srv->ev, con->fd); |
|
|
|
|
int changed = 0; |
|
|
|
@ -1920,29 +1904,12 @@ static int server_main (server * const srv, int argc, char **argv) {
|
|
|
|
|
if (changed) { |
|
|
|
|
connection_state_machine(srv, con); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#if DEBUG_CONNECTION_STATES |
|
|
|
|
if (cs == 0) { |
|
|
|
|
fprintf(stderr, "connection-state: "); |
|
|
|
|
cs = 1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
fprintf(stderr, "c[%d,%d]: %s ", |
|
|
|
|
con->fd, |
|
|
|
|
con->fcgi.fd, |
|
|
|
|
connection_get_state(con->state)); |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#ifdef DEBUG_CONNECTION_STATES |
|
|
|
|
if (cs == 1) fprintf(stderr, "\n"); |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (handle_sig_child) { |
|
|
|
|
__attribute_noinline__ |
|
|
|
|
static void server_handle_sigchld (server * const srv) { |
|
|
|
|
pid_t pid; |
|
|
|
|
handle_sig_child = 0; |
|
|
|
|
do { |
|
|
|
|
int status; |
|
|
|
|
pid = waitpid(-1, &status, WNOHANG); |
|
|
|
@ -1958,6 +1925,34 @@ static int server_main (server * const srv, int argc, char **argv) {
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} while (pid > 0 || (-1 == pid && errno == EINTR)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
__attribute_hot__ |
|
|
|
|
__attribute_noinline__ |
|
|
|
|
static int server_main_loop (server * const srv) { |
|
|
|
|
time_t last_active_ts = time(NULL); |
|
|
|
|
|
|
|
|
|
while (!srv_shutdown) { |
|
|
|
|
int n; |
|
|
|
|
|
|
|
|
|
if (handle_sig_hup) { |
|
|
|
|
handle_sig_hup = 0; |
|
|
|
|
if (server_handle_sighup(srv)) return -1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (handle_sig_alarm) { |
|
|
|
|
time_t min_ts = time(NULL); |
|
|
|
|
#ifdef USE_ALARM |
|
|
|
|
handle_sig_alarm = 0; |
|
|
|
|
#endif |
|
|
|
|
if (min_ts != srv->cur_ts) { |
|
|
|
|
server_handle_sigalrm(srv, min_ts, last_active_ts); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (handle_sig_child) { |
|
|
|
|
handle_sig_child = 0; |
|
|
|
|
server_handle_sigchld(srv); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (graceful_shutdown) { |
|
|
|
@ -2039,7 +2034,7 @@ static int server_main (server * const srv, int argc, char **argv) {
|
|
|
|
|
|
|
|
|
|
if (n >= 0) fdevent_sched_run(srv, srv->ev); |
|
|
|
|
|
|
|
|
|
for (ndx = 0; ndx < srv->joblist->used; ndx++) { |
|
|
|
|
for (size_t ndx = 0; ndx < srv->joblist->used; ++ndx) { |
|
|
|
|
connection *con = srv->joblist->ptr[ndx]; |
|
|
|
|
connection_state_machine(srv, con); |
|
|
|
|
} |
|
|
|
@ -2070,6 +2065,7 @@ static int server_main (server * const srv, int argc, char **argv) {
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
__attribute_cold__ |
|
|
|
|
int main (int argc, char **argv) { |
|
|
|
|
int rc; |
|
|
|
|
|
|
|
|
@ -2096,6 +2092,7 @@ int main (int argc, char **argv) {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
rc = server_main(srv, argc, argv); |
|
|
|
|
if (rc > 0) rc = server_main_loop(srv); |
|
|
|
|
|
|
|
|
|
/* clean-up */ |
|
|
|
|
remove_pid_file(srv); |
|
|
|
|