summaryrefslogtreecommitdiffhomepage
path: root/src/event
diff options
context:
space:
mode:
Diffstat (limited to 'src/event')
-rw-r--r--src/event/modules/ngx_aio_module.c18
-rw-r--r--src/event/modules/ngx_devpoll_module.c18
-rw-r--r--src/event/modules/ngx_iocp_module.c56
-rw-r--r--src/event/modules/ngx_kqueue_module.c29
-rw-r--r--src/event/modules/ngx_poll_module.c124
-rw-r--r--src/event/modules/ngx_select_module.c94
-rw-r--r--src/event/ngx_event.c111
-rw-r--r--src/event/ngx_event.h8
-rw-r--r--src/event/ngx_event_accept.c21
-rw-r--r--src/event/ngx_event_acceptex.c12
-rw-r--r--src/event/ngx_event_timer.c48
11 files changed, 347 insertions, 192 deletions
diff --git a/src/event/modules/ngx_aio_module.c b/src/event/modules/ngx_aio_module.c
index cc48926de..cdfb1b01f 100644
--- a/src/event/modules/ngx_aio_module.c
+++ b/src/event/modules/ngx_aio_module.c
@@ -9,8 +9,8 @@
#endif
-static int ngx_aio_init(ngx_log_t *log);
-static void ngx_aio_done(ngx_log_t *log);
+static int ngx_aio_init(ngx_cycle_t *cycle);
+static void ngx_aio_done(ngx_cycle_t *cycle);
static int ngx_aio_add_event(ngx_event_t *ev, int event, u_int flags);
static int ngx_aio_del_event(ngx_event_t *ev, int event, u_int flags);
static int ngx_aio_del_connection(ngx_connection_t *c);
@@ -52,31 +52,33 @@ ngx_module_t ngx_aio_module = {
&ngx_aio_module_ctx, /* module context */
NULL, /* module directives */
NGX_EVENT_MODULE, /* module type */
- NULL /* init module */
+ NULL, /* init module */
+ NULL /* init child */
};
#if (HAVE_KQUEUE)
-static int ngx_aio_init(ngx_log_t *log)
+static int ngx_aio_init(ngx_cycle_t *cycle)
{
- if (ngx_kqueue_module_ctx.actions.init(log) == NGX_ERROR) {
+ if (ngx_kqueue_module_ctx.actions.init(cycle) == NGX_ERROR) {
return NGX_ERROR;
}
+ ngx_io = ngx_os_aio;
+
ngx_event_flags = NGX_HAVE_AIO_EVENT|NGX_USE_AIO_EVENT;
ngx_event_actions = ngx_aio_module_ctx.actions;
- ngx_io = ngx_os_aio;
return NGX_OK;
}
-static void ngx_aio_done(ngx_log_t *log)
+static void ngx_aio_done(ngx_cycle_t *cycle)
{
- ngx_kqueue_module_ctx.actions.done(log);
+ ngx_kqueue_module_ctx.actions.done(cycle);
}
diff --git a/src/event/modules/ngx_devpoll_module.c b/src/event/modules/ngx_devpoll_module.c
index 47313e949..05aed62fd 100644
--- a/src/event/modules/ngx_devpoll_module.c
+++ b/src/event/modules/ngx_devpoll_module.c
@@ -317,8 +317,9 @@ int ngx_devpoll_process_events(ngx_log_t *log)
events = ioctl(dp, DP_POLL, &dvp);
if (events == -1) {
- ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "ioctl(DP_POLL) failed");
- return NGX_ERROR;
+ err = ngx_errno;
+ } else {
+ err = 0;
}
nchanges = 0;
@@ -326,6 +327,10 @@ int ngx_devpoll_process_events(ngx_log_t *log)
if ((int) timer != INFTIM) {
gettimeofday(&tv, NULL);
delta = tv.tv_sec * 1000 + tv.tv_usec / 1000 - delta;
+
+#if (NGX_DEBUG_EVENT)
+ ngx_log_debug(log, "devpoll timer: %d, delta: %d" _ timer _ delta);
+#endif
ngx_event_expire_timers(delta);
} else {
@@ -334,11 +339,16 @@ int ngx_devpoll_process_events(ngx_log_t *log)
"ioctl(DP_POLL) returns no events without timeout");
return NGX_ERROR;
}
- }
#if (NGX_DEBUG_EVENT)
- ngx_log_debug(log, "devpoll timer: %d, delta: %d" _ timer _ delta);
+ ngx_log_debug(log, "devpoll timer: %d, delta: %d" _ timer _ delta);
#endif
+ }
+
+ if (err) {
+ ngx_log_error(NGX_LOG_ALERT, log, err, "ioctl(DP_POLL) failed");
+ return NGX_ERROR;
+ }
for (i = 0; i < events; i++) {
diff --git a/src/event/modules/ngx_iocp_module.c b/src/event/modules/ngx_iocp_module.c
index 004a3da38..2f31eb6fb 100644
--- a/src/event/modules/ngx_iocp_module.c
+++ b/src/event/modules/ngx_iocp_module.c
@@ -10,13 +10,13 @@
#include <ngx_iocp_module.h>
-static int ngx_iocp_init(ngx_log_t *log);
-static void ngx_iocp_done(ngx_log_t *log);
+static int ngx_iocp_init(ngx_cycle_t *cycle);
+static void ngx_iocp_done(ngx_cycle_t *cycle);
static int ngx_iocp_add_event(ngx_event_t *ev, int event, u_int key);
static int ngx_iocp_del_connection(ngx_connection_t *c);
static int ngx_iocp_process_events(ngx_log_t *log);
-static void *ngx_iocp_create_conf(ngx_pool_t *pool);
-static char *ngx_iocp_init_conf(ngx_pool_t *pool, void *conf);
+static void *ngx_iocp_create_conf(ngx_cycle_t *cycle);
+static char *ngx_iocp_init_conf(ngx_cycle_t *cycle, void *conf);
static ngx_str_t iocp_name = ngx_string("iocp");
@@ -72,31 +72,37 @@ ngx_module_t ngx_iocp_module = {
&ngx_iocp_module_ctx, /* module context */
ngx_iocp_commands, /* module directives */
NGX_EVENT_MODULE, /* module type */
- NULL /* init module */
+ NULL, /* init module */
+ NULL /* init child */
};
static HANDLE iocp;
-static int ngx_iocp_init(ngx_log_t *log)
+static int ngx_iocp_init(ngx_cycle_t *cycle)
{
ngx_iocp_conf_t *cf;
- cf = ngx_event_get_conf(ngx_iocp_module);
+ cf = ngx_event_get_conf(cycle->conf_ctx, ngx_iocp_module);
- iocp = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, cf->threads);
+ if (iocp == NULL) {
+ iocp = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0,
+ cf->threads);
+ }
if (iocp == NULL) {
- ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,
+ ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,
"CreateIoCompletionPort() failed");
return NGX_ERROR;
}
- if (ngx_event_timer_init(log) == NGX_ERROR) {
+ if (ngx_event_timer_init(cycle) == NGX_ERROR) {
return NGX_ERROR;
}
+ ngx_io = ngx_os_io;
+
ngx_event_actions = ngx_iocp_module_ctx.actions;
ngx_event_flags = NGX_HAVE_AIO_EVENT|NGX_HAVE_IOCP_EVENT;
@@ -105,14 +111,16 @@ static int ngx_iocp_init(ngx_log_t *log)
}
-static void ngx_iocp_done(ngx_log_t *log)
+static void ngx_iocp_done(ngx_cycle_t *cycle)
{
if (CloseHandle(iocp) == -1) {
- ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
- "iocp CloseHandle() failed");
+ ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
+ "iocp CloseHandle() failed");
}
- ngx_event_timer_done(log);
+ iocp = NULL;
+
+ ngx_event_timer_done(cycle);
}
@@ -177,7 +185,16 @@ static int ngx_iocp_process_events(ngx_log_t *log)
if (rc == 0) {
err = ngx_errno;
+ } else {
+ err = 0;
+ }
+
+ if (timer != INFINITE) {
+ delta = ngx_msec() - delta;
+ ngx_event_expire_timers(delta);
+ }
+ if (err) {
if (ovlp == NULL) {
if (err != WAIT_TIMEOUT) {
ngx_log_error(NGX_LOG_ALERT, log, err,
@@ -191,11 +208,6 @@ static int ngx_iocp_process_events(ngx_log_t *log)
}
}
- if (timer != INFINITE) {
- delta = ngx_msec() - delta;
- ngx_event_expire_timers(delta);
- }
-
if (ovlp) {
ev = ovlp->event;
@@ -224,11 +236,11 @@ ngx_log_debug(log, "iocp ev handler: %08x" _ ev->event_handler);
}
-static void *ngx_iocp_create_conf(ngx_pool_t *pool)
+static void *ngx_iocp_create_conf(ngx_cycle_t *cycle)
{
ngx_iocp_conf_t *cf;
- ngx_test_null(cf, ngx_palloc(pool, sizeof(ngx_iocp_conf_t)),
+ ngx_test_null(cf, ngx_palloc(cycle->pool, sizeof(ngx_iocp_conf_t)),
NGX_CONF_ERROR);
cf->threads = NGX_CONF_UNSET;
@@ -239,7 +251,7 @@ static void *ngx_iocp_create_conf(ngx_pool_t *pool)
}
-static char *ngx_iocp_init_conf(ngx_pool_t *pool, void *conf)
+static char *ngx_iocp_init_conf(ngx_cycle_t *cycle, void *conf)
{
ngx_iocp_conf_t *cf = conf;
diff --git a/src/event/modules/ngx_kqueue_module.c b/src/event/modules/ngx_kqueue_module.c
index bdd1ff4c3..d0a9d2e48 100644
--- a/src/event/modules/ngx_kqueue_module.c
+++ b/src/event/modules/ngx_kqueue_module.c
@@ -23,8 +23,8 @@ static int ngx_kqueue_del_event(ngx_event_t *ev, int event, u_int flags);
static int ngx_kqueue_set_event(ngx_event_t *ev, int filter, u_int flags);
static int ngx_kqueue_process_events(ngx_log_t *log);
-static void *ngx_kqueue_create_conf(ngx_pool_t *pool);
-static char *ngx_kqueue_init_conf(ngx_pool_t *pool, void *conf);
+static void *ngx_kqueue_create_conf(ngx_cycle_t *cycle);
+static char *ngx_kqueue_init_conf(ngx_cycle_t *cycle, void *conf);
int ngx_kqueue = -1;
@@ -311,6 +311,7 @@ static int ngx_kqueue_set_event(ngx_event_t *ev, int filter, u_int flags)
static int ngx_kqueue_process_events(ngx_log_t *log)
{
int events, instance, i;
+ ngx_err_t err;
ngx_msec_t timer, delta;
ngx_event_t *ev;
struct timeval tv;
@@ -338,8 +339,9 @@ static int ngx_kqueue_process_events(ngx_log_t *log)
events = kevent(ngx_kqueue, change_list, nchanges, event_list, nevents, tp);
if (events == -1) {
- ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "kevent() failed");
- return NGX_ERROR;
+ err = ngx_errno;
+ } else {
+ err = 0;
}
nchanges = 0;
@@ -348,6 +350,10 @@ static int ngx_kqueue_process_events(ngx_log_t *log)
gettimeofday(&tv, NULL);
delta = tv.tv_sec * 1000 + tv.tv_usec / 1000 - delta;
+#if (NGX_DEBUG_EVENT)
+ ngx_log_debug(log, "kevent timer: %d, delta: %d" _ timer _ delta);
+#endif
+
/* The expired timers must be handled before a processing of the events
because the new timers can be added during a processing */
@@ -359,11 +365,16 @@ static int ngx_kqueue_process_events(ngx_log_t *log)
"kevent() returned no events without timeout");
return NGX_ERROR;
}
- }
#if (NGX_DEBUG_EVENT)
- ngx_log_debug(log, "kevent timer: %d, delta: %d" _ timer _ delta);
+ ngx_log_debug(log, "kevent timer: %d, delta: %d" _ timer _ delta);
#endif
+ }
+
+ if (err) {
+ ngx_log_error(NGX_LOG_ALERT, log, err, "kevent() failed");
+ return NGX_ERROR;
+ }
for (i = 0; i < events; i++) {
@@ -439,11 +450,11 @@ static int ngx_kqueue_process_events(ngx_log_t *log)
}
-static void *ngx_kqueue_create_conf(ngx_pool_t *pool)
+static void *ngx_kqueue_create_conf(ngx_cycle_t *cycle)
{
ngx_kqueue_conf_t *kcf;
- ngx_test_null(kcf, ngx_palloc(pool, sizeof(ngx_kqueue_conf_t)),
+ ngx_test_null(kcf, ngx_palloc(cycle->pool, sizeof(ngx_kqueue_conf_t)),
NGX_CONF_ERROR);
kcf->changes = NGX_CONF_UNSET;
@@ -453,7 +464,7 @@ static void *ngx_kqueue_create_conf(ngx_pool_t *pool)
}
-static char *ngx_kqueue_init_conf(ngx_pool_t *pool, void *conf)
+static char *ngx_kqueue_init_conf(ngx_cycle_t *cycle, void *conf)
{
ngx_kqueue_conf_t *kcf = conf;
diff --git a/src/event/modules/ngx_poll_module.c b/src/event/modules/ngx_poll_module.c
index b03ed1745..71ac7f2ca 100644
--- a/src/event/modules/ngx_poll_module.c
+++ b/src/event/modules/ngx_poll_module.c
@@ -9,8 +9,8 @@
#include <ngx_event.h>
-static int ngx_poll_init(ngx_log_t *log);
-static void ngx_poll_done(ngx_log_t *log);
+static int ngx_poll_init(ngx_cycle_t *cycle);
+static void ngx_poll_done(ngx_cycle_t *cycle);
static int ngx_poll_add_event(ngx_event_t *ev, int event, u_int flags);
static int ngx_poll_del_event(ngx_event_t *ev, int event, u_int flags);
static int ngx_poll_process_events(ngx_log_t *log);
@@ -49,35 +49,64 @@ ngx_module_t ngx_poll_module = {
&ngx_poll_module_ctx, /* module context */
NULL, /* module directives */
NGX_EVENT_MODULE, /* module type */
- NULL /* init module */
+ NULL, /* init module */
+ NULL /* init child */
};
-static int ngx_poll_init(ngx_log_t *log)
+static int ngx_poll_init(ngx_cycle_t *cycle)
{
- ngx_event_conf_t *ecf;
+ struct pollfd *list;
+ ngx_event_t **index;
- ecf = ngx_event_get_conf(ngx_event_core_module);
+ if (event_list == NULL) {
+ nevents = 0;
+ }
+
+ if (cycle->old_cycle == NULL
+ || cycle->old_cycle->connection_n < cycle->connection_n)
+ {
+ ngx_test_null(list,
+ ngx_alloc(sizeof(struct pollfd) * cycle->connection_n,
+ cycle->log),
+ NGX_ERROR);
+
+ if (event_list) {
+ ngx_memcpy(list, event_list, sizeof(ngx_event_t *) * nevents);
+ ngx_free(event_list);
+ }
- ngx_test_null(event_list,
- ngx_alloc(sizeof(struct pollfd) * ecf->connections, log),
- NGX_ERROR);
+ event_list = list;
+
+ ngx_test_null(index,
+ ngx_alloc(sizeof(ngx_event_t *) * cycle->connection_n,
+ cycle->log),
+ NGX_ERROR);
+
+ if (event_index) {
+ ngx_memcpy(index, event_index, sizeof(ngx_event_t *) * nevents);
+ ngx_free(event_index);
+ }
- ngx_test_null(event_index,
- ngx_alloc(sizeof(ngx_event_t *) * ecf->connections, log),
- NGX_ERROR);
+ event_index = index;
- ngx_test_null(ready_index,
- ngx_alloc(sizeof(ngx_event_t *) * 2 * ecf->connections, log),
- NGX_ERROR);
+ if (ready_index) {
+ ngx_free(ready_index);
+ }
- nevents = 0;
+ ngx_test_null(ready_index,
+ ngx_alloc(sizeof(ngx_event_t *) * 2 * cycle->connection_n,
+ cycle->log),
+ NGX_ERROR);
+ }
- if (ngx_event_timer_init(log) == NGX_ERROR) {
+ if (ngx_event_timer_init(cycle) == NGX_ERROR) {
return NGX_ERROR;
}
+ ngx_io = ngx_os_io;
+
ngx_event_actions = ngx_poll_module_ctx.actions;
ngx_event_flags = NGX_HAVE_LEVEL_EVENT
@@ -88,13 +117,15 @@ static int ngx_poll_init(ngx_log_t *log)
}
-static void ngx_poll_done(ngx_log_t *log)
+static void ngx_poll_done(ngx_cycle_t *cycle)
{
- ngx_event_timer_done(log);
+ ngx_event_timer_done(cycle);
ngx_free(event_list);
ngx_free(event_index);
ngx_free(ready_index);
+
+ event_list = NULL;
}
@@ -191,12 +222,13 @@ static int ngx_poll_del_event(ngx_event_t *ev, int event, u_int flags)
static int ngx_poll_process_events(ngx_log_t *log)
{
- int ready, found;
- u_int i, nready;
- ngx_msec_t timer, delta;
- ngx_err_t err;
- ngx_event_t *ev;
- ngx_connection_t *c;
+ int ready, found;
+ u_int i, nready;
+ ngx_msec_t timer, delta;
+ ngx_err_t err;
+ ngx_cycle_t **cycle;
+ ngx_event_t *ev;
+ ngx_connection_t *c;
timer = ngx_event_find_timer();
@@ -217,15 +249,22 @@ static int ngx_poll_process_events(ngx_log_t *log)
ngx_log_debug(log, "poll timer: %d" _ timer);
#endif
- if ((ready = poll(event_list, nevents, timer)) == -1) {
- ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "poll() failed");
- return NGX_ERROR;
+ ready = poll(event_list, nevents, timer);
+
+ if (ready == -1) {
+ err = ngx_errno;
+ } else {
+ err = 0;
}
ngx_log_debug(log, "poll ready %d" _ ready);
if ((int) timer != INFTIM) {
delta = ngx_msec() - delta;
+
+#if (NGX_DEBUG_EVENT)
+ ngx_log_debug(log, "poll timer: %d, delta: %d" _ timer _ delta);
+#endif
ngx_event_expire_timers(delta);
} else {
@@ -234,16 +273,39 @@ static int ngx_poll_process_events(ngx_log_t *log)
"poll() returns no events without timeout");
return NGX_ERROR;
}
- }
#if (NGX_DEBUG_EVENT)
- ngx_log_debug(log, "poll timer: %d, delta: %d" _ timer _ delta);
+ ngx_log_debug(log, "poll timer: %d, delta: %d" _ timer _ delta);
#endif
+ }
+
+ if (err) {
+ ngx_log_error(NGX_LOG_ALERT, log, err, "poll() failed");
+ return NGX_ERROR;
+ }
nready = 0;
for (i = 0; i < nevents && ready; i++) {
- c = &ngx_connections[event_list[i].fd];
+ c = &ngx_cycle->connections[event_list[i].fd];
+
+ if (c->fd == -1) {
+ cycle = ngx_old_cycles.elts;
+ for (i = 0; i < ngx_old_cycles.nelts; i++) {
+ if (cycle[i] == NULL) {
+ continue;
+ }
+ c = &cycle[i]->connections[event_list[i].fd];
+ if (c->fd != -1) {
+ break;
+ }
+ }
+ }
+
+ if (c->fd == -1) {
+ ngx_log_error(NGX_LOG_ALERT, log, 0, "unkonwn cycle");
+ exit(1);
+ }
#if (NGX_DEBUG_EVENT)
ngx_log_debug(log, "poll: fd:%d, ev:%d, rev:%d" _
diff --git a/src/event/modules/ngx_select_module.c b/src/event/modules/ngx_select_module.c
index a55be3034..3bf42efcb 100644
--- a/src/event/modules/ngx_select_module.c
+++ b/src/event/modules/ngx_select_module.c
@@ -9,13 +9,13 @@
#include <ngx_event.h>
-static int ngx_select_init(ngx_log_t *log);
-static void ngx_select_done(ngx_log_t *log);
+static int ngx_select_init(ngx_cycle_t *cycle);
+static void ngx_select_done(ngx_cycle_t *cycle);
static int ngx_select_add_event(ngx_event_t *ev, int event, u_int flags);
static int ngx_select_del_event(ngx_event_t *ev, int event, u_int flags);
static int ngx_select_process_events(ngx_log_t *log);
-static char *ngx_select_init_conf(ngx_pool_t *pool, void *conf);
+static char *ngx_select_init_conf(ngx_cycle_t *cycle, void *conf);
static fd_set master_read_fd_set;
@@ -62,33 +62,50 @@ ngx_module_t ngx_select_module = {
&ngx_select_module_ctx, /* module context */
NULL, /* module directives */
NGX_EVENT_MODULE, /* module type */
- NULL /* init module */
+ NULL, /* init module */
+ NULL /* init child */
};
-static int ngx_select_init(ngx_log_t *log)
+static int ngx_select_init(ngx_cycle_t *cycle)
{
- ngx_event_conf_t *ecf;
-
- ecf = ngx_event_get_conf(ngx_event_core_module);
-
- FD_ZERO(&master_read_fd_set);
- FD_ZERO(&master_write_fd_set);
+ ngx_event_t **index;
- ngx_test_null(event_index,
- ngx_alloc(sizeof(ngx_event_t *) * 2 * ecf->connections, log),
- NGX_ERROR);
+ if (event_index == NULL) {
+ FD_ZERO(&master_read_fd_set);
+ FD_ZERO(&master_write_fd_set);
+ nevents = 0;
+ }
- ngx_test_null(ready_index,
- ngx_alloc(sizeof(ngx_event_t *) * 2 * ecf->connections, log),
- NGX_ERROR);
+ if (cycle->old_cycle == NULL
+ || cycle->old_cycle->connection_n < cycle->connection_n)
+ {
+ ngx_test_null(index,
+ ngx_alloc(sizeof(ngx_event_t *) * 2 * cycle->connection_n,
+ cycle->log),
+ NGX_ERROR);
+
+ if (event_index) {
+ ngx_memcpy(index, event_index, sizeof(ngx_event_t *) * nevents);
+ ngx_free(event_index);
+ }
+ event_index = index;
- nevents = 0;
+ if (ready_index) {
+ ngx_free(ready_index);
+ }
+ ngx_test_null(ready_index,
+ ngx_alloc(sizeof(ngx_event_t *) * 2 * cycle->connection_n,
+ cycle->log),
+ NGX_ERROR);
+ }
- if (ngx_event_timer_init(log) == NGX_ERROR) {
+ if (ngx_event_timer_init(cycle) == NGX_ERROR) {
return NGX_ERROR;
}
+ ngx_io = ngx_os_io;
+
ngx_event_actions = ngx_select_module_ctx.actions;
ngx_event_flags = NGX_HAVE_LEVEL_EVENT
@@ -105,12 +122,14 @@ static int ngx_select_init(ngx_log_t *log)
}
-static void ngx_select_done(ngx_log_t *log)
+static void ngx_select_done(ngx_cycle_t *cycle)
{
- ngx_event_timer_done(log);
+ ngx_event_timer_done(cycle);
ngx_free(event_index);
ngx_free(ready_index);
+
+ event_index = NULL;
}
@@ -229,6 +248,7 @@ static int ngx_select_process_events(ngx_log_t *log)
{
int ready, found;
u_int i, nready;
+ ngx_err_t err;
ngx_msec_t timer, delta;
ngx_event_t *ev;
ngx_connection_t *c;
@@ -277,15 +297,15 @@ static int ngx_select_process_events(ngx_log_t *log)
#endif
#if (WIN32)
- if ((ready = select(0, &work_read_fd_set, &work_write_fd_set, NULL, tp))
+ ready = select(0, &work_read_fd_set, &work_write_fd_set, NULL, tp);
#else
- if ((ready = select(max_fd + 1, &work_read_fd_set, &work_write_fd_set,
- NULL, tp))
+ ready = select(max_fd + 1, &work_read_fd_set, &work_write_fd_set, NULL, tp);
#endif
- == -1)
- {
- ngx_log_error(NGX_LOG_ALERT, log, ngx_socket_errno, "select() failed");
- return NGX_ERROR;
+
+ if (ready == -1) {
+ err = ngx_socket_errno;
+ } else {
+ err = 0;
}
#if (NGX_DEBUG_EVENT)
@@ -295,6 +315,10 @@ static int ngx_select_process_events(ngx_log_t *log)
if (timer) {
/* TODO: Linux returns time in tv */
delta = ngx_msec() - delta;
+
+#if (NGX_DEBUG_EVENT)
+ ngx_log_debug(log, "select timer: %d, delta: %d" _ timer _ delta);
+#endif
ngx_event_expire_timers(delta);
} else {
@@ -303,11 +327,17 @@ static int ngx_select_process_events(ngx_log_t *log)
"select() returns no events without timeout");
return NGX_ERROR;
}
- }
#if (NGX_DEBUG_EVENT)
- ngx_log_debug(log, "select timer: %d, delta: %d" _ timer _ delta);
+ ngx_log_debug(log, "select timer: %d, delta: %d" _ timer _ delta);
#endif
+ ngx_event_expire_timers(delta);
+ }
+
+ if (err) {
+ ngx_log_error(NGX_LOG_ALERT, log, err, "select() failed");
+ return NGX_ERROR;
+ }
nready = 0;
@@ -372,11 +402,11 @@ static int ngx_select_process_events(ngx_log_t *log)
}
-static char *ngx_select_init_conf(ngx_pool_t *pool, void *conf)
+static char *ngx_select_init_conf(ngx_cycle_t *cycle, void *conf)
{
ngx_event_conf_t *ecf;
- ecf = ngx_event_get_conf(ngx_event_core_module);
+ ecf = ngx_event_get_conf(cycle->conf_ctx, ngx_event_core_module);
/* the default FD_SETSIZE is 1024U in FreeBSD 5.x */
diff --git a/src/event/ngx_event.c b/src/event/ngx_event.c
index bc4386a77..7c709e344 100644
--- a/src/event/ngx_event.c
+++ b/src/event/ngx_event.c
@@ -21,23 +21,16 @@ extern ngx_module_t ngx_devpoll_module;
#include <ngx_aio_module.h>
#endif
-static int ngx_event_init_module(ngx_cycle_t *cycle);
-static int ngx_event_init_child(ngx_cycle_t *cycle);
static int ngx_event_init(ngx_cycle_t *cycle);
-
static char *ngx_events_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
static char *ngx_event_use(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
-static void *ngx_event_create_conf(ngx_pool_t *pool);
-static char *ngx_event_init_conf(ngx_pool_t *pool, void *conf);
+static void *ngx_event_create_conf(ngx_cycle_t *cycle);
+static char *ngx_event_init_conf(ngx_cycle_t *cycle, void *conf);
int ngx_event_flags;
ngx_event_actions_t ngx_event_actions;
-int ngx_max_connections;
-ngx_connection_t *ngx_connections;
-ngx_event_t *ngx_read_events, *ngx_write_events;
-
static int ngx_event_max_module;
@@ -111,32 +104,11 @@ ngx_module_t ngx_event_core_module = {
&ngx_event_core_module_ctx, /* module context */
ngx_event_core_commands, /* module directives */
NGX_EVENT_MODULE, /* module type */
- ngx_event_init_module, /* init module */
- ngx_event_init_child /* init child */
+ NULL, /* init module */
+ ngx_event_init /* init child */
};
-
-static int ngx_event_init_module(ngx_cycle_t *cycle)
-{
- if (cycle->one_process) {
- return ngx_event_init(cycle);
- }
-
- return NGX_OK;
-}
-
-
-static int ngx_event_init_child(ngx_cycle_t *cycle)
-{
- if (cycle->one_process) {
- return NGX_OK;
- }
-
- return ngx_event_init(cycle);
-}
-
-
static int ngx_event_init(ngx_cycle_t *cycle)
{
int m, i, fd;
@@ -154,6 +126,8 @@ static int ngx_event_init(ngx_cycle_t *cycle)
ngx_log_debug(cycle->log, "CONN: %d" _ ecf->connections);
ngx_log_debug(cycle->log, "TYPE: %d" _ ecf->use);
+ cycle->connection_n = ecf->connections;
+
for (m = 0; ngx_modules[m]; m++) {
if (ngx_modules[m]->type != NGX_EVENT_MODULE) {
continue;
@@ -168,30 +142,34 @@ ngx_log_debug(cycle->log, "TYPE: %d" _ ecf->use);
}
}
- if (ngx_max_connections && ngx_max_connections < ecf->connections) {
+ if (cycle->old_cycle && cycle->old_cycle->connection_n < ecf->connections) {
/* TODO: push into delayed array and temporary pool */
- ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, "NOT READY");
+ ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, "NOT READY: connections");
exit(1);
}
- ngx_max_connections = ecf->connections;
-
- ngx_test_null(ngx_connections,
+ ngx_test_null(cycle->connections,
ngx_alloc(sizeof(ngx_connection_t) * ecf->connections,
cycle->log),
NGX_ERROR);
- ngx_test_null(ngx_read_events,
+ c = cycle->connections;
+ for (i = 0; i < cycle->connection_n; i++) {
+ c[i].fd = -1;
+ }
+
+ ngx_test_null(cycle->read_events,
ngx_alloc(sizeof(ngx_event_t) * ecf->connections, cycle->log),
NGX_ERROR);
- ngx_test_null(ngx_write_events,
+ ngx_test_null(cycle->write_events,
ngx_alloc(sizeof(ngx_event_t) * ecf->connections, cycle->log),
NGX_ERROR);
/* for each listening socket */
- for (s = cycle->listening.elts, i = 0; i < cycle->listening.nelts; i++) {
+ s = cycle->listening.elts;
+ for (i = 0; i < cycle->listening.nelts; i++) {
fd = s[i].fd;
@@ -201,33 +179,38 @@ ngx_log_debug(cycle->log, "TYPE: %d" _ ecf->use);
* so to find a connection we divide a socket number by 4.
*/
- c = &ngx_connections[fd / 4];
- rev = &ngx_read_events[fd / 4];
- wev = &ngx_write_events[fd / 4];
-#else
- c = &ngx_connections[fd];
- rev = &ngx_read_events[fd];
- wev = &ngx_write_events[fd];
+ fd /= 4;
#endif
+ c = &cycle->connections[fd];
+ rev = &cycle->read_events[fd];
+ wev = &cycle->write_events[fd];
+
ngx_memzero(c, sizeof(ngx_connection_t));
ngx_memzero(rev, sizeof(ngx_event_t));
- c->fd = fd;
+ c->fd = s[i].fd;
c->listening = &s[i];
c->ctx = s[i].ctx;
c->servers = s[i].servers;
c->log = s[i].log;
+ c->read = rev;
+ /* required by iocp in "c->write->active = 1" */
+ c->write = wev;
+
+#if 0
ngx_test_null(rev->log, ngx_palloc(cycle->pool, sizeof(ngx_log_t)),
NGX_ERROR);
ngx_memcpy(rev->log, c->log, sizeof(ngx_log_t));
- c->read = rev;
- c->write = wev;
+#endif
+
+ rev->log = c->log;
rev->data = c;
rev->index = NGX_INVALID_INDEX;
+
#if 0
rev->listening = 1;
#endif
@@ -238,6 +221,21 @@ ngx_log_debug(cycle->log, "TYPE: %d" _ ecf->use);
rev->deferred_accept = s[i].deferred_accept;
#endif
+ /* required by poll */
+ wev->index = NGX_INVALID_INDEX;
+
+ if ((ngx_event_flags & NGX_HAVE_IOCP_EVENT) == 0) {
+ if (s[i].remain) {
+
+ if (ngx_del_event(&cycle->old_cycle->read_events[fd],
+ NGX_READ_EVENT, 0) == NGX_ERROR) {
+ return NGX_ERROR;
+ }
+
+ cycle->old_cycle->connections[fd].fd = -1;
+ }
+ }
+
#if (WIN32)
if (ngx_event_flags & NGX_HAVE_IOCP_EVENT) {
@@ -247,7 +245,7 @@ ngx_log_debug(cycle->log, "TYPE: %d" _ ecf->use);
return NGX_ERROR;
}
- iocpcf = ngx_event_get_conf(ngx_iocp_module);
+ iocpcf = ngx_event_get_conf(cycle->conf_ctx, ngx_iocp_module);
if (ngx_event_post_acceptex(&s[i], iocpcf->acceptex) == NGX_ERROR) {
return NGX_ERROR;
}
@@ -305,7 +303,7 @@ static char *ngx_events_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
if (module->create_conf) {
ngx_test_null((*ctx)[ngx_modules[m]->ctx_index],
- module->create_conf(cf->pool),
+ module->create_conf(cf->cycle),
NGX_CONF_ERROR);
}
}
@@ -328,7 +326,8 @@ static char *ngx_events_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
module = ngx_modules[m]->ctx;
if (module->init_conf) {
- rv = module->init_conf(cf->pool, (*ctx)[ngx_modules[m]->ctx_index]);
+ rv = module->init_conf(cf->cycle,
+ (*ctx)[ngx_modules[m]->ctx_index]);
if (rv != NGX_CONF_OK) {
return rv;
}
@@ -371,11 +370,11 @@ static char *ngx_event_use(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
}
-static void *ngx_event_create_conf(ngx_pool_t *pool)
+static void *ngx_event_create_conf(ngx_cycle_t *cycle)
{
ngx_event_conf_t *ecf;
- ngx_test_null(ecf, ngx_palloc(pool, sizeof(ngx_event_conf_t)),
+ ngx_test_null(ecf, ngx_palloc(cycle->pool, sizeof(ngx_event_conf_t)),
NGX_CONF_ERROR);
ecf->connections = NGX_CONF_UNSET;
@@ -386,7 +385,7 @@ static void *ngx_event_create_conf(ngx_pool_t *pool)
}
-static char *ngx_event_init_conf(ngx_pool_t *pool, void *conf)
+static char *ngx_event_init_conf(ngx_cycle_t *cycle, void *conf)
{
ngx_event_conf_t *ecf = conf;
diff --git a/src/event/ngx_event.h b/src/event/ngx_event.h
index 2d64c11c6..2b8e0f64c 100644
--- a/src/event/ngx_event.h
+++ b/src/event/ngx_event.h
@@ -308,10 +308,6 @@ typedef struct {
-extern ngx_event_t *ngx_read_events;
-extern ngx_event_t *ngx_write_events;
-extern ngx_connection_t *ngx_connections;
-
#if !(USE_KQUEUE)
extern ngx_event_actions_t ngx_event_actions;
extern ngx_event_type_e ngx_event_type;
@@ -337,8 +333,8 @@ typedef struct {
typedef struct {
ngx_str_t *name;
- void *(*create_conf)(ngx_pool_t *p);
- char *(*init_conf)(ngx_pool_t *p, void *conf);
+ void *(*create_conf)(ngx_cycle_t *cycle);
+ char *(*init_conf)(ngx_cycle_t *cycle, void *conf);
ngx_event_actions_t actions;
} ngx_event_module_t;
diff --git a/src/event/ngx_event_accept.c b/src/event/ngx_event_accept.c
index a71dced8a..953f314ba 100644
--- a/src/event/ngx_event_accept.c
+++ b/src/event/ngx_event_accept.c
@@ -17,7 +17,7 @@ void ngx_event_accept(ngx_event_t *ev)
ngx_connection_t *c, *ls;
ngx_event_conf_t *ecf;
- ecf = ngx_event_get_conf(ngx_cycle.conf_ctx, ngx_event_core_module);
+ ecf = ngx_event_get_conf(ngx_cycle->conf_ctx, ngx_event_core_module);
ls = ev->data;
@@ -134,17 +134,18 @@ ngx_log_debug(ev->log, "ADDR %s" _ ls->listening->addr_text.data);
if (s % 4) {
ngx_log_error(NGX_LOG_EMERG, ls->log, 0,
- ngx_socket_n " created socket %d", s);
+ ngx_socket_n
+ " created socket %d, not divisible by 4", s);
exit(1);
}
- rev = &ngx_read_events[s / 4];
- wev = &ngx_write_events[s / 4];
- c = &ngx_connections[s / 4];
+ c = &ngx_cycle->connections[s / 4];
+ rev = &ngx_cycle->read_events[s / 4];
+ wev = &ngx_cycle->write_events[s / 4];
#else
- rev = &ngx_read_events[s];
- wev = &ngx_write_events[s];
- c = &ngx_connections[s];
+ c = &ngx_cycle->connections[s];
+ rev = &ngx_cycle->read_events[s];
+ wev = &ngx_cycle->write_events[s];
#endif
instance = rev->instance;
@@ -178,12 +179,14 @@ ngx_log_debug(ev->log, "ADDR %s" _ ls->listening->addr_text.data);
c->ctx = ls->ctx;
c->servers = ls->servers;
+#if 0
c->log = ngx_palloc(c->pool, sizeof(ngx_log_t));
if (c->log == NULL) {
return;
}
ngx_memcpy(c->log, ev->log, sizeof(ngx_log_t));
- rev->log = wev->log = c->log;
+#endif
+ rev->log = wev->log = c->log = ev->log;
/* TODO: x86: MT: lock xadd, MP: lock xadd, shared */
c->number = ngx_connection_counter++;
diff --git a/src/event/ngx_event_acceptex.c b/src/event/ngx_event_acceptex.c
index 04dddb16c..8fd978eb0 100644
--- a/src/event/ngx_event_acceptex.c
+++ b/src/event/ngx_event_acceptex.c
@@ -87,17 +87,19 @@ int ngx_event_post_acceptex(ngx_listening_t *ls, int n)
if (s % 4) {
ngx_log_error(NGX_LOG_EMERG, ls->log, 0,
- ngx_socket_n " created socket %d", s);
+ ngx_socket_n
+ " created socket %d, not divisible by 4", s);
+
exit(1);
}
- rev = &ngx_read_events[s / 4];
- wev = &ngx_write_events[s / 4];
- c = &ngx_connections[s / 4];
+ c = &ngx_cycle->connections[s / 4];
+ rev = &ngx_cycle->read_events[s / 4];
+ wev = &ngx_cycle->write_events[s / 4];
+ ngx_memzero(c, sizeof(ngx_connection_t));
ngx_memzero(rev, sizeof(ngx_event_t));
ngx_memzero(wev, sizeof(ngx_event_t));
- ngx_memzero(c, sizeof(ngx_connection_t));
rev->index = wev->index = NGX_INVALID_INDEX;
diff --git a/src/event/ngx_event_timer.c b/src/event/ngx_event_timer.c
index 412298312..e6bec42ee 100644
--- a/src/event/ngx_event_timer.c
+++ b/src/event/ngx_event_timer.c
@@ -4,9 +4,10 @@
#include <ngx_event.h>
-static ngx_event_t *ngx_timer_queue;
+static ngx_event_t *ngx_timer_queue, ngx_temp_timer_queue;
static int ngx_timer_cur_queue;
static int ngx_timer_queue_num;
+static int ngx_expire_timers;
int ngx_event_timer_init(ngx_cycle_t *cycle)
@@ -43,10 +44,13 @@ int ngx_event_timer_init(ngx_cycle_t *cycle)
} else if (ngx_timer_queue_num > ecf->timer_queues) {
/* STUB */
- ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, "NOT READY");
+ ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, "NOT READY: timer");
exit(1);
}
+ ngx_temp_timer_queue.timer_prev = &ngx_temp_timer_queue;
+ ngx_temp_timer_queue.timer_next = &ngx_temp_timer_queue;
+
return NGX_OK;;
}
@@ -61,7 +65,7 @@ void ngx_event_timer_done(ngx_cycle_t *cycle)
void ngx_event_add_timer(ngx_event_t *ev, ngx_msec_t timer)
{
- ngx_event_t *e;
+ ngx_event_t *e, *queue;
#if (NGX_DEBUG_EVENT)
ngx_connection_t *c = ev->data;
@@ -74,18 +78,24 @@ void ngx_event_add_timer(ngx_event_t *ev, ngx_msec_t timer)
return;
}
- for (e = ngx_timer_queue[ngx_timer_cur_queue].timer_next;
- e != &ngx_timer_queue[ngx_timer_cur_queue] && timer > e->timer_delta;
+ if (ngx_expire_timers) {
+ queue = &ngx_temp_timer_queue;
+
+ } else {
+ queue = &ngx_timer_queue[ngx_timer_cur_queue++];
+
+ if (ngx_timer_cur_queue >= ngx_timer_queue_num) {
+ ngx_timer_cur_queue = 0;
+ }
+ }
+
+ for (e = queue->timer_next;
+ e != queue && timer > e->timer_delta;
e = e->timer_next)
{
timer -= e->timer_delta;
}
- ngx_timer_cur_queue++;
- if (ngx_timer_cur_queue >= ngx_timer_queue_num) {
- ngx_timer_cur_queue = 0;
- }
-
ev->timer_delta = timer;
ev->timer_next = e;
@@ -127,6 +137,8 @@ void ngx_event_expire_timers(ngx_msec_t timer)
ngx_msec_t delta;
ngx_event_t *ev;
+ ngx_expire_timers = 1;
+
for (i = 0; i < ngx_timer_queue_num; i++) {
delta = timer;
@@ -161,4 +173,20 @@ void ngx_event_expire_timers(ngx_msec_t timer)
ev->event_handler(ev);
}
}
+
+ ngx_expire_timers = 0;
+
+ if (ngx_temp_timer_queue.timer_next == &ngx_temp_timer_queue) {
+ return;
+ }
+
+ timer = 0;
+
+ while (ngx_temp_timer_queue.timer_next != &ngx_temp_timer_queue) {
+ timer += ngx_temp_timer_queue.timer_next->timer_delta;
+ ev = ngx_temp_timer_queue.timer_next;
+
+ ngx_del_timer(ev);
+ ngx_add_timer(ev, timer);
+ }
}