diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/core/nginx.c | 61 | ||||
-rw-r--r-- | src/core/nginx.h | 2 | ||||
-rw-r--r-- | src/core/ngx_config.h | 8 | ||||
-rw-r--r-- | src/event/modules/ngx_kqueue_module.c | 2 | ||||
-rw-r--r-- | src/event/modules/ngx_poll_module.c | 4 | ||||
-rw-r--r-- | src/event/modules/ngx_select_module.c | 9 | ||||
-rw-r--r-- | src/event/ngx_event.c | 11 | ||||
-rw-r--r-- | src/event/ngx_event.h | 8 | ||||
-rw-r--r-- | src/event/ngx_event_accept.c | 49 | ||||
-rw-r--r-- | src/os/unix/ngx_aio_write_chain.c | 2 | ||||
-rw-r--r-- | src/os/unix/ngx_errno.h | 1 | ||||
-rw-r--r-- | src/os/unix/ngx_linux_config.h | 12 | ||||
-rw-r--r-- | src/os/unix/ngx_process.c | 1 | ||||
-rw-r--r-- | src/os/unix/ngx_process.h | 1 |
14 files changed, 94 insertions, 77 deletions
diff --git a/src/core/nginx.c b/src/core/nginx.c index b436dd45a..61cc53e48 100644 --- a/src/core/nginx.c +++ b/src/core/nginx.c @@ -173,7 +173,7 @@ int main(int argc, char *const *argv, char **envp) #else - if (ccf->daemon != 0) { + if (!ngx_inherited && ccf->daemon != 0) { if (ngx_daemon(cycle->log) == NGX_ERROR) { return 1; } @@ -356,11 +356,10 @@ static void ngx_master_process_cycle(ngx_cycle_t *cycle, ngx_master_ctx_t *ctx) live = 0; for (i = 0; i < ngx_last_process; i++) { - ngx_log_debug6(NGX_LOG_DEBUG_EVENT, cycle->log, 0, + ngx_log_debug5(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "child: " PID_T_FMT - " s:%d e:%d t:%d d:%d r:%d", + " e:%d t:%d d:%d r:%d", ngx_processes[i].pid, - ngx_processes[i].signal, ngx_processes[i].exiting, ngx_processes[i].exited, ngx_processes[i].detached, @@ -396,13 +395,10 @@ static void ngx_master_process_cycle(ngx_cycle_t *cycle, ngx_master_ctx_t *ctx) ngx_processes[ngx_last_process]; } - } else if (!ngx_processes[i].detached - && (ngx_terminate || ngx_quit)) + } else if (ngx_processes[i].exiting + || !ngx_processes[i].detached) { live = 1; - - } else if (ngx_processes[i].exiting) { - live = 1; } } } @@ -470,44 +466,27 @@ static void ngx_master_process_cycle(ngx_cycle_t *cycle, ngx_master_ctx_t *ctx) if (signo) { for (i = 0; i < ngx_last_process; i++) { - if (!ngx_processes[i].detached) { - ngx_processes[i].signal = signo; - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, - cycle->log, 0, - "signal " PID_T_FMT " %d", - ngx_processes[i].pid, signo); + if (ngx_processes[i].detached) { + continue; } - } - signo = 0; - } - for (i = 0; i < ngx_last_process; i++) { + ngx_log_debug2(NGX_LOG_DEBUG_CORE, cycle->log, 0, + "kill (" PID_T_FMT ", %d)" , + ngx_processes[i].pid, signo); - if (ngx_processes[i].signal == 0) { - continue; - } + if (kill(ngx_processes[i].pid, signo) == -1) { + ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, + "kill(%d, %d) failed", + ngx_processes[i].pid, signo); + continue; + } - ngx_log_debug2(NGX_LOG_DEBUG_CORE, cycle->log, 0, - "kill (" PID_T_FMT ", %d)" , - ngx_processes[i].pid, - ngx_processes[i].signal); - - if (kill(ngx_processes[i].pid, ngx_processes[i].signal) - == -1) - { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "kill(%d, %d) failed", - ngx_processes[i].pid, - ngx_processes[i].signal); - continue; + if (signo != ngx_signal_value(NGX_REOPEN_SIGNAL)) { + ngx_processes[i].exiting = 1; + } } - if (ngx_processes[i].signal - != ngx_signal_value(NGX_REOPEN_SIGNAL)) - { - ngx_processes[i].exiting = 1; - } + signo = 0; } if (ngx_reopen || ngx_reconfigure || ngx_timer) { diff --git a/src/core/nginx.h b/src/core/nginx.h index 4596fd0dc..99423d32a 100644 --- a/src/core/nginx.h +++ b/src/core/nginx.h @@ -2,7 +2,7 @@ #define _NGINX_H_INCLUDED_ -#define NGINX_VER "nginx/0.0.1" +#define NGINX_VER "nginx/0.0.2" #define NGINX_CONF "nginx.conf" #define NGINX_PID "nginx.pid" #define NGINX_NEW_PID NGINX_PID ".newbin" diff --git a/src/core/ngx_config.h b/src/core/ngx_config.h index 3039d58f5..796d7a20b 100644 --- a/src/core/ngx_config.h +++ b/src/core/ngx_config.h @@ -2,7 +2,10 @@ #define _NGX_CONFIG_H_INCLUDED_ -#if 0 +#include <ngx_auto_config.h> + + +#if 1 /* STUB to allocate a big ngx_connections */ #undef FD_SETSIZE #define FD_SETSIZE 5000 @@ -53,9 +56,6 @@ typedef int ngx_flag_t; #define PTR_FMT "%08X" -#include <ngx_auto_config.h> - - #ifndef NGX_SERVER_ROOT #define NGX_SERVER_ROOT "./" #if 0 diff --git a/src/event/modules/ngx_kqueue_module.c b/src/event/modules/ngx_kqueue_module.c index e169c8c3e..28966feb2 100644 --- a/src/event/modules/ngx_kqueue_module.c +++ b/src/event/modules/ngx_kqueue_module.c @@ -375,6 +375,8 @@ static int ngx_kqueue_process_events(ngx_log_t *log) ngx_gettimeofday(&tv); ngx_time_update(tv.tv_sec); + ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0, "kevent events: %d", events); + delta = ngx_elapsed_msec; ngx_elapsed_msec = tv.tv_sec * 1000 + tv.tv_usec / 1000 - ngx_start_msec; diff --git a/src/event/modules/ngx_poll_module.c b/src/event/modules/ngx_poll_module.c index 37c10e361..8727c2120 100644 --- a/src/event/modules/ngx_poll_module.c +++ b/src/event/modules/ngx_poll_module.c @@ -320,12 +320,12 @@ static int ngx_poll_process_events(ngx_log_t *log) found = 0; - if (event_list[i].revents & (POLLIN|POLLERR|POLLHUP)) { + if (event_list[i].revents & (POLLIN|POLLERR|POLLHUP|POLLNVAL)) { found = 1; ready_index[nready++] = c->read; } - if (event_list[i].revents & (POLLOUT|POLLERR|POLLHUP)) { + if (event_list[i].revents & (POLLOUT|POLLERR|POLLHUP|POLLNVAL)) { found = 1; ready_index[nready++] = c->write; } diff --git a/src/event/modules/ngx_select_module.c b/src/event/modules/ngx_select_module.c index 18d1bde7c..602960b0d 100644 --- a/src/event/modules/ngx_select_module.c +++ b/src/event/modules/ngx_select_module.c @@ -315,14 +315,15 @@ static int ngx_select_process_events(ngx_log_t *log) deltas += delta; if (deltas > 1000) { ngx_gettimeofday(&tv); - deltas = tv.tv_usec / 1000; ngx_time_update(tv.tv_sec); + deltas = tv.tv_usec / 1000; } ngx_log_debug2(NGX_LOG_DEBUG_EVENT, log, 0, "select timer: %d, delta: %d", timer, (int) delta); } else { + delta = 0; ngx_gettimeofday(&tv); ngx_time_update(tv.tv_sec); @@ -438,8 +439,10 @@ static char *ngx_select_init_conf(ngx_cycle_t *cycle, void *conf) /* disable warning: the default FD_SETSIZE is 1024U in FreeBSD 5.x */ if ((unsigned) ecf->connections > FD_SETSIZE) { - return "maximum number of connections " - "supported by select() is " ngx_value(FD_SETSIZE); + ngx_log_error(NGX_LOG_EMERG, cycle->log, 0, + "the maximum number of files " + "supported by select() is " ngx_value(FD_SETSIZE)); + return NGX_CONF_ERROR; } return NGX_CONF_OK; diff --git a/src/event/ngx_event.c b/src/event/ngx_event.c index bf6634661..482310b3d 100644 --- a/src/event/ngx_event.c +++ b/src/event/ngx_event.c @@ -84,6 +84,13 @@ static ngx_command_t ngx_event_core_commands[] = { 0, NULL }, + { ngx_string("multi_accept"), + NGX_EVENT_CONF|NGX_CONF_TAKE1, + ngx_conf_set_flag_slot, + 0, + offsetof(ngx_event_conf_t, multi_accept), + NULL }, + ngx_null_command }; @@ -421,8 +428,8 @@ static void *ngx_event_create_conf(ngx_cycle_t *cycle) NGX_CONF_ERROR); ecf->connections = NGX_CONF_UNSET; - ecf->timer_queues = NGX_CONF_UNSET; ecf->use = NGX_CONF_UNSET; + ecf->multi_accept = NGX_CONF_UNSET; ecf->name = (void *) NGX_CONF_UNSET; return ecf; @@ -457,7 +464,7 @@ static char *ngx_event_init_conf(ngx_cycle_t *cycle, void *conf) cycle->connection_n = ecf->connections; - ngx_conf_init_value(ecf->timer_queues, 10); + ngx_conf_init_value(ecf->multi_accept, 1); return NGX_CONF_OK; } diff --git a/src/event/ngx_event.h b/src/event/ngx_event.h index 0e7939209..68d9f8199 100644 --- a/src/event/ngx_event.h +++ b/src/event/ngx_event.h @@ -345,10 +345,10 @@ extern ngx_event_actions_t ngx_event_actions; typedef struct { - int connections; - int timer_queues; - int use; - char *name; + int connections; + int use; + ngx_flag_t multi_accept; + char *name; } ngx_event_conf_t; diff --git a/src/event/ngx_event_accept.c b/src/event/ngx_event_accept.c index be282eba2..8ecd29bfb 100644 --- a/src/event/ngx_event_accept.c +++ b/src/event/ngx_event_accept.c @@ -23,6 +23,13 @@ void ngx_event_accept(ngx_event_t *ev) ecf = ngx_event_get_conf(ngx_cycle->conf_ctx, ngx_event_core_module); + if (ngx_event_flags & (NGX_USE_EDGE_EVENT|NGX_USE_SIGIO_EVENT)) { + ev->available = 1; + + } else if (!(ngx_event_flags & NGX_HAVE_KQUEUE_EVENT)) { + ev->available = ecf->multi_accept; + } + ls = ev->data; ngx_log_debug(ev->log, "accept on %s ready: %d" _ @@ -31,26 +38,33 @@ void ngx_event_accept(ngx_event_t *ev) ev->ready = 0; accepted = 0; + pool = NULL; do { - /* - * Create the pool before accept() to avoid copy the sockaddr. - * Although accept() can fail it's an uncommon case - * and besides the pool can be got from the free pool list - */ + if (pool == NULL) { - if (!(pool = ngx_create_pool(ls->listening->pool_size, ev->log))) { - return; + /* + * Create the pool before accept() to avoid copy the sockaddr. + * Although accept() can fail it's an uncommon case + * and besides the pool can be got from the free pool list + */ + + if (!(pool = ngx_create_pool(ls->listening->pool_size, ev->log))) { + return; + } } if (!(sa = ngx_palloc(pool, ls->listening->socklen))) { + ngx_destroy_pool(pool); return; } if (!(log = ngx_palloc(pool, sizeof(ngx_log_t)))) { + ngx_destroy_pool(pool); return; } + ngx_memcpy(log, ls->log, sizeof(ngx_log_t)); pool->log = log; @@ -67,6 +81,8 @@ void ngx_event_accept(ngx_event_t *ev) ngx_log_error(NGX_LOG_NOTICE, log, err, "EAGAIN after %d accepted connection(s)", accepted); + + ngx_destroy_pool(pool); return; } @@ -74,6 +90,17 @@ void ngx_event_accept(ngx_event_t *ev) "accept() on %s failed", ls->listening->addr_text.data); + if (err == NGX_ECONNABORTED) { + if (ngx_event_flags & NGX_HAVE_KQUEUE_EVENT) { + ev->available--; + } + + if (ev->available) { + /* reuse the previously allocated pool */ + continue; + } + } + ngx_destroy_pool(pool); return; } @@ -187,8 +214,10 @@ void ngx_event_accept(ngx_event_t *ev) wev->write = 1; wev->ready = 1; - if (ngx_event_flags & (NGX_USE_AIO_EVENT|NGX_USE_EDGE_EVENT)) { - /* aio, iocp, epoll */ + if (ngx_event_flags + & (NGX_USE_AIO_EVENT|NGX_USE_EDGE_EVENT|NGX_USE_SIGIO_EVENT)) + { + /* aio, iocp, sigio, epoll */ rev->ready = 1; } @@ -229,6 +258,8 @@ void ngx_event_accept(ngx_event_t *ev) } } + pool = NULL; + log->data = NULL; log->handler = NULL; diff --git a/src/os/unix/ngx_aio_write_chain.c b/src/os/unix/ngx_aio_write_chain.c index 73150447f..4146d4f7d 100644 --- a/src/os/unix/ngx_aio_write_chain.c +++ b/src/os/unix/ngx_aio_write_chain.c @@ -58,7 +58,7 @@ ngx_chain_t *ngx_aio_write_chain(ngx_connection_t *c, ngx_chain_t *in) } #if (NGX_DEBUG_WRITE_CHAIN) - ngx_log_debug(c->log, "aio_write sent: " OFF_FMT _ c->sent); + ngx_log_debug(c->log, "aio_write sent: " OFF_T_FMT _ c->sent); #endif for (cl = in; cl; cl = cl->next) { diff --git a/src/os/unix/ngx_errno.h b/src/os/unix/ngx_errno.h index 1542456f8..208faa244 100644 --- a/src/os/unix/ngx_errno.h +++ b/src/os/unix/ngx_errno.h @@ -19,6 +19,7 @@ typedef int ngx_err_t; #define NGX_EAGAIN EWOULDBLOCK #define NGX_EINPROGRESS EINPROGRESS #define NGX_EADDRINUSE EADDRINUSE +#define NGX_ECONNABORTED ECONNABORTED #define NGX_ECONNRESET ECONNRESET #define NGX_ENOTCONN ENOTCONN #define NGX_ETIMEDOUT ETIMEDOUT diff --git a/src/os/unix/ngx_linux_config.h b/src/os/unix/ngx_linux_config.h index de3f2871e..e43a6caa7 100644 --- a/src/os/unix/ngx_linux_config.h +++ b/src/os/unix/ngx_linux_config.h @@ -55,6 +55,10 @@ extern ssize_t sendfile(int s, int fd, int32_t *offset, size_t size); #include <poll.h> #endif +#if (HAVE_EPOLL) +#include <sys/epoll.h> +#endif /* HAVE_EPOLL */ + #if defined TCP_DEFER_ACCEPT && !defined HAVE_DEFERRED_ACCEPT #define HAVE_DEFERRED_ACCEPT 1 @@ -76,14 +80,6 @@ extern ssize_t sendfile(int s, int fd, int32_t *offset, size_t size); #endif -/* - * SuSE 8.2 supports epoll's EPOLLET but misses it in <sys/epoll.h> - */ -#ifndef EPOLLET -#define EPOLLET 0x80000000 -#endif - - #define ngx_setproctitle(title) diff --git a/src/os/unix/ngx_process.c b/src/os/unix/ngx_process.c index bad9a324c..68bdaed7b 100644 --- a/src/os/unix/ngx_process.c +++ b/src/os/unix/ngx_process.c @@ -70,7 +70,6 @@ ngx_pid_t ngx_spawn_process(ngx_cycle_t *cycle, (respawn == NGX_PROCESS_RESPAWN) ? 1 : 0; ngx_processes[ngx_last_process].detached = (respawn == NGX_PROCESS_DETACHED) ? 1 : 0; - ngx_processes[ngx_last_process].signal = 0; ngx_processes[ngx_last_process].exited = 0; ngx_processes[ngx_last_process].exiting = 0; ngx_last_process++; diff --git a/src/os/unix/ngx_process.h b/src/os/unix/ngx_process.h index 195d3fd75..a1aa74bd7 100644 --- a/src/os/unix/ngx_process.h +++ b/src/os/unix/ngx_process.h @@ -8,7 +8,6 @@ typedef void (*ngx_spawn_proc_pt) (ngx_cycle_t *cycle, void *data); typedef struct { ngx_pid_t pid; - int signal; int status; ngx_spawn_proc_pt proc; |