aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/nginx.c61
-rw-r--r--src/core/nginx.h2
-rw-r--r--src/core/ngx_config.h8
-rw-r--r--src/event/modules/ngx_kqueue_module.c2
-rw-r--r--src/event/modules/ngx_poll_module.c4
-rw-r--r--src/event/modules/ngx_select_module.c9
-rw-r--r--src/event/ngx_event.c11
-rw-r--r--src/event/ngx_event.h8
-rw-r--r--src/event/ngx_event_accept.c49
-rw-r--r--src/os/unix/ngx_aio_write_chain.c2
-rw-r--r--src/os/unix/ngx_errno.h1
-rw-r--r--src/os/unix/ngx_linux_config.h12
-rw-r--r--src/os/unix/ngx_process.c1
-rw-r--r--src/os/unix/ngx_process.h1
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;