# HG changeset patch # User Igor Sysoev # Date 1089741552 0 # Node ID 537de4dca8ca1989c0083710a7a1de1857d9437d # Parent 80e72c428b3969bd07aae56a9409ba408f405ab0 nginx-0.0.7-2004-07-13-21:59:12 import diff --git a/src/core/ngx_log.h b/src/core/ngx_log.h --- a/src/core/ngx_log.h +++ b/src/core/ngx_log.h @@ -163,6 +163,12 @@ void ngx_assert_core(ngx_log_t *log, con ngx_log_error_core(NGX_LOG_DEBUG, log, err, fmt, \ arg1, arg2, arg3, arg4, arg5, arg6) +#define ngx_log_debug7(level, log, err, fmt, \ + arg1, arg2, arg3, arg4, arg5, arg6, arg7) \ + if (log->log_level & level) \ + ngx_log_error_core(NGX_LOG_DEBUG, log, err, fmt, \ + arg1, arg2, arg3, arg4, arg5, arg6, arg7) + #else /* NO VARIADIC MACROS */ #define ngx_log_debug0(level, log, err, fmt) \ @@ -194,6 +200,12 @@ void ngx_assert_core(ngx_log_t *log, con if (log->log_level & level) \ ngx_log_debug_core(log, err, fmt, arg1, arg2, arg3, arg4, arg5, arg6) +#define ngx_log_debug7(level, log, err, fmt, \ + arg1, arg2, arg3, arg4, arg5, arg6, arg7) \ + if (log->log_level & level) \ + ngx_log_debug_core(log, err, fmt, \ + arg1, arg2, arg3, arg4, arg5, arg6, arg7) + #endif #else /* NO NGX_DEBUG */ @@ -205,6 +217,8 @@ void ngx_assert_core(ngx_log_t *log, con #define ngx_log_debug4(level, log, err, fmt, arg1, arg2, arg3, arg4) #define ngx_log_debug5(level, log, err, fmt, arg1, arg2, arg3, arg4, arg5) #define ngx_log_debug6(level, log, err, fmt, arg1, arg2, arg3, arg4, arg5, arg6) +#define ngx_log_debug7(level, log, err, fmt, arg1, arg2, arg3, arg4, arg5, arg6, + arg7) #endif diff --git a/src/event/modules/ngx_devpoll_module.c b/src/event/modules/ngx_devpoll_module.c --- a/src/event/modules/ngx_devpoll_module.c +++ b/src/event/modules/ngx_devpoll_module.c @@ -405,7 +405,8 @@ int ngx_devpoll_process_events(ngx_cycle ngx_time_update(tv.tv_sec); delta = ngx_elapsed_msec; - ngx_elapsed_msec = tv.tv_sec * 1000 + tv.tv_usec / 1000 - ngx_start_msec; + ngx_elapsed_msec = (ngx_epoch_msec_t) tv.tv_sec * 1000 + + tv.tv_usec / 1000 - ngx_start_msec; if (err) { ngx_log_error((err == NGX_EINTR) ? NGX_LOG_INFO : NGX_LOG_ALERT, diff --git a/src/event/modules/ngx_epoll_module.c b/src/event/modules/ngx_epoll_module.c --- a/src/event/modules/ngx_epoll_module.c +++ b/src/event/modules/ngx_epoll_module.c @@ -459,7 +459,8 @@ int ngx_epoll_process_events(ngx_cycle_t ngx_time_update(tv.tv_sec); delta = ngx_elapsed_msec; - ngx_elapsed_msec = tv.tv_sec * 1000 + tv.tv_usec / 1000 - ngx_start_msec; + ngx_elapsed_msec = (ngx_epoch_msec_t) tv.tv_sec * 1000 + + tv.tv_usec / 1000 - ngx_start_msec; if (timer != NGX_TIMER_INFINITE) { delta = ngx_elapsed_msec - delta; diff --git a/src/event/modules/ngx_iocp_module.c b/src/event/modules/ngx_iocp_module.c --- a/src/event/modules/ngx_iocp_module.c +++ b/src/event/modules/ngx_iocp_module.c @@ -198,7 +198,8 @@ static ngx_int_t ngx_iocp_process_events "iocp: %d b:%d k:%d ov:" PTR_FMT, rc, bytes, key, ovlp); delta = ngx_elapsed_msec; - ngx_elapsed_msec = tv.tv_sec * 1000 + tv.tv_usec / 1000 - ngx_start_msec; + ngx_elapsed_msec = (ngx_epoch_msec_t) tv.tv_sec * 1000 + + tv.tv_usec / 1000 - ngx_start_msec; if (err) { if (ovlp == NULL) { diff --git a/src/event/modules/ngx_kqueue_module.c b/src/event/modules/ngx_kqueue_module.c --- a/src/event/modules/ngx_kqueue_module.c +++ b/src/event/modules/ngx_kqueue_module.c @@ -527,9 +527,6 @@ static ngx_int_t ngx_kqueue_process_even ngx_elapsed_msec = (ngx_epoch_msec_t) tv.tv_sec * 1000 + tv.tv_usec / 1000 - ngx_start_msec; - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "elapsed: %qd", ngx_elapsed_msec); - if (err) { ngx_log_error((err == NGX_EINTR) ? NGX_LOG_INFO : NGX_LOG_ALERT, cycle->log, err, "kevent() failed"); diff --git a/src/event/modules/ngx_poll_module.c b/src/event/modules/ngx_poll_module.c --- a/src/event/modules/ngx_poll_module.c +++ b/src/event/modules/ngx_poll_module.c @@ -341,7 +341,8 @@ static ngx_int_t ngx_poll_process_events ngx_time_update(tv.tv_sec); delta = ngx_elapsed_msec; - ngx_elapsed_msec = tv.tv_sec * 1000 + tv.tv_usec / 1000 - ngx_start_msec; + ngx_elapsed_msec = (ngx_epoch_msec_t) tv.tv_sec * 1000 + + tv.tv_usec / 1000 - ngx_start_msec; ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "poll ready %d of %d", ready, nevents); diff --git a/src/event/modules/ngx_rtsig_module.c b/src/event/modules/ngx_rtsig_module.c --- a/src/event/modules/ngx_rtsig_module.c +++ b/src/event/modules/ngx_rtsig_module.c @@ -389,7 +389,8 @@ ngx_int_t ngx_rtsig_process_events(ngx_c ngx_time_update(tv.tv_sec); delta = ngx_elapsed_msec; - ngx_elapsed_msec = tv.tv_sec * 1000 + tv.tv_usec / 1000 - ngx_start_msec; + ngx_elapsed_msec = (ngx_epoch_msec_t) tv.tv_sec * 1000 + + tv.tv_usec / 1000 - ngx_start_msec; if (err) { ngx_accept_mutex_unlock(); diff --git a/src/event/modules/ngx_select_module.c b/src/event/modules/ngx_select_module.c --- a/src/event/modules/ngx_select_module.c +++ b/src/event/modules/ngx_select_module.c @@ -378,8 +378,8 @@ static ngx_int_t ngx_select_process_even ngx_time_update(tv.tv_sec); deltas = tv.tv_usec / 1000; - ngx_elapsed_msec = tv.tv_sec * 1000 + tv.tv_usec / 1000 - - ngx_start_msec; + ngx_elapsed_msec = (ngx_epoch_msec_t) tv.tv_sec * 1000 + + tv.tv_usec / 1000 - ngx_start_msec; } else { ngx_elapsed_msec += delta; } @@ -392,8 +392,9 @@ static ngx_int_t ngx_select_process_even ngx_gettimeofday(&tv); ngx_time_update(tv.tv_sec); - ngx_elapsed_msec = tv.tv_sec * 1000 + tv.tv_usec / 1000 - - ngx_start_msec; + ngx_elapsed_msec = (ngx_epoch_msec_t) tv.tv_sec * 1000 + + tv.tv_usec / 1000 - ngx_start_msec; + if (ready == 0) { ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, "select() returned no events without timeout"); diff --git a/src/http/modules/ngx_http_charset_filter.c b/src/http/modules/ngx_http_charset_filter.c --- a/src/http/modules/ngx_http_charset_filter.c +++ b/src/http/modules/ngx_http_charset_filter.c @@ -148,12 +148,19 @@ static ngx_int_t ngx_http_charset_header } #endif - if (r->headers_out.content_type == NULL - || ngx_strncasecmp(r->headers_out.content_type->value.data, + if (r->headers_out.content_type == NULL) { + return ngx_http_next_header_filter(r); + } + + if (ngx_strncasecmp(r->headers_out.content_type->value.data, "text/", 5) != 0 - || ngx_strstr(r->headers_out.content_type->value.data, "charset") - != NULL - ) + && ngx_strncasecmp(r->headers_out.content_type->value.data, + "application/x-javascript", 24) != 0) + { + return ngx_http_next_header_filter(r); + } + + if (ngx_strstr(r->headers_out.content_type->value.data, "charset") != NULL) { return ngx_http_next_header_filter(r); } diff --git a/src/http/modules/ngx_http_headers_filter.c b/src/http/modules/ngx_http_headers_filter.c --- a/src/http/modules/ngx_http_headers_filter.c +++ b/src/http/modules/ngx_http_headers_filter.c @@ -125,7 +125,8 @@ static ngx_int_t ngx_http_headers_filter cc->value.data = (u_char *) "no-cache"; } else { - cc->value.data = ngx_palloc(r->pool, TIME_T_LEN + 1); + cc->value.data = ngx_palloc(r->pool, + sizeof("max-age=") + TIME_T_LEN + 1); if (cc->value.data == NULL) { return NGX_ERROR; } diff --git a/src/os/unix/ngx_process.c b/src/os/unix/ngx_process.c --- a/src/os/unix/ngx_process.c +++ b/src/os/unix/ngx_process.c @@ -20,7 +20,23 @@ ngx_pid_t ngx_spawn_process(ngx_cycle_t ngx_pid_t pid; ngx_int_t s; - s = respawn >= 0 ? respawn : ngx_last_process; + if (respawn >= 0) { + s = respawn; + + } else { + for (s = 0; s < ngx_last_process; s++) { + if (ngx_processes[s].pid == -1) { + break; + } + } + + if (s == NGX_MAX_PROCESSES) { + ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, + "no more than %d processes can be spawned", + NGX_MAX_PROCESSES); + return NGX_ERROR; + } + } if (respawn != NGX_PROCESS_DETACHED) { @@ -146,7 +162,9 @@ ngx_pid_t ngx_spawn_process(ngx_cycle_t break; } - ngx_last_process++; + if (s == ngx_last_process) { + ngx_last_process++; + } return pid; } @@ -220,7 +238,7 @@ void ngx_process_get_status() one = 1; - process = ""; + process = "unknown process"; for (i = 0; i < ngx_last_process; i++) { if (ngx_processes[i].pid == pid) { @@ -231,10 +249,6 @@ void ngx_process_get_status() } } - if (i == ngx_last_process) { - process = "unknown process"; - } - if (WTERMSIG(status)) { ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0, "%s " PID_T_FMT " exited on signal %d%s", diff --git a/src/os/unix/ngx_process_cycle.c b/src/os/unix/ngx_process_cycle.c --- a/src/os/unix/ngx_process_cycle.c +++ b/src/os/unix/ngx_process_cycle.c @@ -306,11 +306,17 @@ static void ngx_start_worker_processes(n ch.slot = ngx_process_slot; ch.fd = ngx_processes[ngx_process_slot].channel[0]; - for (i = 0; i < ngx_last_process - 1; i++) { + for (i = 0; i < ngx_last_process; i++) { + + if (i == ngx_process_slot || ngx_processes[i].pid == -1) { + continue; + } - ngx_log_debug4(NGX_LOG_DEBUG_CORE, cycle->log, 0, - "pass channel s: %d pid:" PID_T_FMT " fd:%d to:" - PID_T_FMT, ch.slot, ch.pid, ch.fd, ngx_processes[i].pid); + ngx_log_debug5(NGX_LOG_DEBUG_CORE, cycle->log, 0, + "pass channel s:%d pid:" PID_T_FMT + " fd:%d to s:%d pid:" PID_T_FMT, + ch.slot, ch.pid, ch.fd, + i, ngx_processes[i].pid); /* TODO: NGX_AGAIN */ @@ -367,7 +373,7 @@ static void ngx_signal_worker_processes( for (i = 0; i < ngx_last_process; i++) { - if (ngx_processes[i].detached) { + if (ngx_processes[i].detached || ngx_processes[i].pid == -1) { continue; } @@ -432,8 +438,9 @@ static ngx_uint_t ngx_reap_childs(ngx_cy live = 0; for (i = 0; i < ngx_last_process; i++) { - ngx_log_debug6(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "child: " PID_T_FMT " e:%d t:%d d:%d r:%d j:%d", + ngx_log_debug7(NGX_LOG_DEBUG_EVENT, cycle->log, 0, + "child: %d " PID_T_FMT " e:%d t:%d d:%d r:%d j:%d", + i, ngx_processes[i].pid, ngx_processes[i].exiting, ngx_processes[i].exited, @@ -441,6 +448,10 @@ static ngx_uint_t ngx_reap_childs(ngx_cy ngx_processes[i].respawn, ngx_processes[i].just_respawn); + if (ngx_processes[i].pid == -1) { + continue; + } + if (ngx_processes[i].exited) { if (!ngx_processes[i].detached) { @@ -454,13 +465,14 @@ static ngx_uint_t ngx_reap_childs(ngx_cy for (n = 0; n < ngx_last_process; n++) { if (ngx_processes[n].exited + || ngx_processes[n].pid == -1 || ngx_processes[n].channel[0] == -1) { continue; } ngx_log_debug3(NGX_LOG_DEBUG_CORE, cycle->log, 0, - "pass close channel s: %d pid:" PID_T_FMT + "pass close channel s:%d pid:" PID_T_FMT " to:" PID_T_FMT, ch.slot, ch.pid, ngx_processes[n].pid); /* TODO: NGX_AGAIN */ @@ -498,8 +510,11 @@ static ngx_uint_t ngx_reap_childs(ngx_cy } } - if (i != --ngx_last_process) { - ngx_processes[i--] = ngx_processes[ngx_last_process]; + if (i == ngx_last_process - 1) { + ngx_last_process--; + + } else { + ngx_processes[i].pid = -1; } } else if (ngx_processes[i].exiting || !ngx_processes[i].detached) { @@ -593,14 +608,9 @@ static void ngx_worker_process_cycle(ngx } } - for (n = 0; n <= ngx_last_process; n++) { + for (n = 0; n < ngx_last_process; n++) { - if (n == ngx_process_slot) { - if (close(ngx_processes[n].channel[0]) == -1) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "close() failed"); - } - + if (ngx_processes[n].pid == -1) { continue; } @@ -610,6 +620,11 @@ static void ngx_worker_process_cycle(ngx } } + if (close(ngx_processes[ngx_process_slot].channel[0]) == -1) { + ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, + "close() failed"); + } + #if 0 ngx_last_process = 0; #endif