# HG changeset patch # User Igor Sysoev # Date 1033139129 0 # Node ID 8dd06e2844f5c49427d10a3cbcb7e229689dfd76 # Parent 6ce4755737b4ad174efadd9dd58363dadae550a6 nginx-0.0.1-2002-09-27-19:05:29 import 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 @@ -27,7 +27,7 @@ static int nchanges, nevent static ngx_event_t timer_queue; -void ngx_kqueue_init(int max_connections, ngx_log_t *log) +int ngx_kqueue_init(int max_connections, ngx_log_t *log) { int size = sizeof(struct kevent) * 512; @@ -38,11 +38,11 @@ void ngx_kqueue_init(int max_connections if (kq == -1) { ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "kqueue() failed"); - exit(1); + return NGX_ERROR; } - change_list = ngx_alloc(size, log); - event_list = ngx_alloc(size, log); + ngx_test_null(change_list, ngx_alloc(size, log), NGX_ERROR); + ngx_test_null(event_list, ngx_alloc(size, log), NGX_ERROR); timer_queue.timer_prev = &timer_queue; timer_queue.timer_next = &timer_queue; @@ -53,6 +53,8 @@ void ngx_kqueue_init(int max_connections ngx_event_actions.timer = ngx_kqueue_add_timer; ngx_event_actions.process = ngx_kqueue_process_events; #endif + + return NGX_OK; } int ngx_kqueue_add_event(ngx_event_t *ev, int event, u_int flags) @@ -77,7 +79,7 @@ int ngx_kqueue_set_event(ngx_event_t *ev if (nchanges >= nevents) { ngx_log_error(NGX_LOG_WARN, ev->log, 0, - "ngx_kqueue_set_event: change list is filled up"); + "kqueue change list is filled up"); if (kevent(kq, change_list, nchanges, NULL, 0, &ts) == -1) { ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno, "kevent failed"); diff --git a/src/event/modules/ngx_kqueue_module.h b/src/event/modules/ngx_kqueue_module.h --- a/src/event/modules/ngx_kqueue_module.h +++ b/src/event/modules/ngx_kqueue_module.h @@ -6,7 +6,7 @@ #include #include -void ngx_kqueue_init(int max_connections, ngx_log_t *log); +int ngx_kqueue_init(int max_connections, ngx_log_t *log); int ngx_kqueue_add_event(ngx_event_t *ev, int event, u_int flags); int ngx_kqueue_del_event(ngx_event_t *ev, int event); int ngx_kqueue_set_event(ngx_event_t *ev, int filter, u_int flags); 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 @@ -20,14 +20,17 @@ static int max_write; static int max_fd; #endif -static ngx_event_t event_queue; -static ngx_event_t timer_queue; +static int nevents; + +static ngx_event_t **event_index; +static ngx_event_t **ready_index; +static ngx_event_t timer_queue; static fd_set *ngx_select_get_fd_set(ngx_socket_t fd, int event, ngx_log_t *log); -void ngx_select_init(int max_connections, ngx_log_t *log) +int ngx_select_init(int max_connections, ngx_log_t *log) { if (max_connections > FD_SETSIZE) { ngx_log_error(NGX_LOG_EMERG, log, 0, @@ -44,8 +47,15 @@ void ngx_select_init(int max_connections FD_ZERO(&master_read_fd_set); FD_ZERO(&master_write_fd_set); - event_queue.prev = &event_queue; - event_queue.next = &event_queue; + ngx_test_null(event_index, + ngx_alloc(sizeof(ngx_event_t *) * 2 * max_connections, log), + NGX_ERROR); + + ngx_test_null(ready_index, + ngx_alloc(sizeof(ngx_event_t *) * 2 * max_connections, log), + NGX_ERROR); + + nevents = 0; timer_queue.timer_prev = &timer_queue; timer_queue.timer_next = &timer_queue; @@ -60,6 +70,8 @@ void ngx_select_init(int max_connections #else max_fd = -1; #endif + + return NGX_OK; } int ngx_select_add_event(ngx_event_t *ev, int event, u_int flags) @@ -102,10 +114,9 @@ int ngx_select_add_event(ngx_event_t *ev ev->oneshot = (flags & NGX_ONESHOT_EVENT) ? 1: 0; - ev->prev = &event_queue; - ev->next = event_queue.next; - event_queue.next->prev = ev; - event_queue.next = ev; + event_index[nevents] = ev; + ev->index = nevents; + nevents++; return NGX_OK; } @@ -135,23 +146,19 @@ int ngx_select_del_event(ngx_event_t *ev max_fd = -1; #endif - if (ev->prev) - ev->prev->next = ev->next; - - if (ev->next) { - ev->next->prev = ev->prev; - ev->prev = NULL; + if (ev->index < nevents) { + event_index[ev->index] = event_index[nevents]; + event_index[ev->index]->index = ev->index; } - if (ev->prev) - ev->next = NULL; + nevents--; return NGX_OK; } int ngx_select_process_events(ngx_log_t *log) { - int ready, found; + int i, ready, found, nready; u_int timer, delta; ngx_event_t *ev, *nx; ngx_connection_t *c; @@ -176,8 +183,8 @@ int ngx_select_process_events(ngx_log_t #if !(WIN32) if (max_fd == -1) { - for (ev = event_queue.next; ev != &event_queue; ev = ev->next) { - c = (ngx_connection_t *) ev->data; + for (i = 0; i < nevents; i++) { + c = (ngx_connection_t *) event_index[i]->data; if (max_fd < c->fd) max_fd = c->fd; } @@ -231,7 +238,10 @@ int ngx_select_process_events(ngx_log_t } } - for (ev = event_queue.next; ev != &event_queue; /* void */) { + nready = 0; + + for (i = 0; i < nevents; i++) { + ev = event_index[i]; c = (ngx_connection_t *) ev->data; found = 0; @@ -250,26 +260,28 @@ int ngx_select_process_events(ngx_log_t } } - nx = ev->next; + if (found) { + ready_index[nready++] = ev; + } + } - if (found) { - ev->ready = 1; + for (i = 0; i < nready; i++) { + ev = ready_index[i]; - if (ev->oneshot) { - ngx_del_timer(ev); - if (ev->write) - ngx_select_del_event(ev, NGX_WRITE_EVENT); - else - ngx_select_del_event(ev, NGX_READ_EVENT); - } + ev->ready = 1; - if (ev->event_handler(ev) == -1) - ev->close_handler(ev); - - ready--; + if (ev->oneshot) { + ngx_del_timer(ev); + if (ev->write) + ngx_select_del_event(ev, NGX_WRITE_EVENT); + else + ngx_select_del_event(ev, NGX_READ_EVENT); } - ev = nx; + if (ev->event_handler(ev) == -1) + ev->close_handler(ev); + + ready--; } ngx_assert((ready == 0), /* void */ ; , log, "select ready != events"); diff --git a/src/event/modules/ngx_select_module.h b/src/event/modules/ngx_select_module.h --- a/src/event/modules/ngx_select_module.h +++ b/src/event/modules/ngx_select_module.h @@ -6,7 +6,7 @@ #include #include -void ngx_select_init(int max_connections, ngx_log_t *log); +int ngx_select_init(int max_connections, ngx_log_t *log); int ngx_select_add_event(ngx_event_t *ev, int event, u_int flags); int ngx_select_del_event(ngx_event_t *ev, int event); int ngx_select_set_event(ngx_event_t *ev, int filter, u_int flags); diff --git a/src/event/ngx_event.c b/src/event/ngx_event.c --- a/src/event/ngx_event.c +++ b/src/event/ngx_event.c @@ -1,5 +1,6 @@ #include +#include #include #include #include @@ -20,7 +21,7 @@ ngx_event_t *ngx_read_events, *n #if !(USE_KQUEUE) -#if 0 +#if 1 ngx_event_type_e ngx_event_type = NGX_SELECT_EVENT; #else ngx_event_type_e ngx_event_type = NGX_KQUEUE_EVENT; @@ -29,7 +30,7 @@ ngx_event_type_e ngx_event_type = NG ngx_event_actions_t ngx_event_actions; /* ngx_event_type_e order */ -static void (*ngx_event_init[]) (int max_connections, ngx_log_t *log) = { +static int (*ngx_event_init[]) (int max_connections, ngx_log_t *log) = { ngx_select_init, #if (HAVE_POLL) ngx_poll_init, @@ -50,7 +51,8 @@ void ngx_pre_thread(ngx_array_t *ls, ngx /* STUB */ int max_connections = 512; - ngx_init_events(max_connections, log); + if (ngx_init_events(max_connections, log) == NGX_ERROR) + exit(1); ngx_connections = ngx_alloc(sizeof(ngx_connection_t) * max_connections, log); diff --git a/src/event/ngx_event.h b/src/event/ngx_event.h --- a/src/event/ngx_event.h +++ b/src/event/ngx_event.h @@ -20,6 +20,8 @@ struct ngx_event_s { void *context; char *action; + int index; + ngx_event_t *prev; /* queue in select(), poll(), mutex(), */ ngx_event_t *next; /* aio_read(), aio_write() */ diff --git a/src/http/ngx_http_event.c b/src/http/ngx_http_event.c --- a/src/http/ngx_http_event.c +++ b/src/http/ngx_http_event.c @@ -491,7 +491,7 @@ static int ngx_http_handler(ngx_http_req r->connection->read->event_handler = ngx_http_block_read; /* STUB: should find handler */ -#if 0 +#if 1 r->filter = NGX_HTTP_FILTER_NEED_IN_MEMORY; #endif rc = ngx_http_set_default_handler(r);