diff options
Diffstat (limited to 'src/event')
| -rw-r--r-- | src/event/modules/ngx_aio_module.c | 11 | ||||
| -rw-r--r-- | src/event/modules/ngx_kqueue_module.c | 18 | ||||
| -rw-r--r-- | src/event/modules/ngx_select_module.c | 30 | ||||
| -rw-r--r-- | src/event/ngx_event.c | 25 | ||||
| -rw-r--r-- | src/event/ngx_event.h | 12 | ||||
| -rw-r--r-- | src/event/ngx_event_accept.c | 33 | ||||
| -rw-r--r-- | src/event/ngx_event_close.c | 2 | ||||
| -rw-r--r-- | src/event/ngx_event_close.h | 2 | ||||
| -rw-r--r-- | src/event/ngx_event_recv.c | 20 |
9 files changed, 98 insertions, 55 deletions
diff --git a/src/event/modules/ngx_aio_module.c b/src/event/modules/ngx_aio_module.c index 38bf7c057..b18d4928a 100644 --- a/src/event/modules/ngx_aio_module.c +++ b/src/event/modules/ngx_aio_module.c @@ -1,4 +1,14 @@ +/* 1 */ +int ngx_posix_aio_process_events(ngx_log_t *log) +{ + listen via SIGIO; + aio_* via SIGxxx; + + sigsuspend()/sigwaitinfo()/sigtimedwait(); +} + +/* 2 */ int ngx_posix_aio_process_events(ngx_log_t *log) { unmask signal @@ -18,6 +28,7 @@ int ngx_posix_aio_process_events(ngx_log_t *log) aio } +/* 3 */ int ngx_posix_aio_process_events(ngx_log_t *log) { unmask signal diff --git a/src/event/modules/ngx_kqueue_module.c b/src/event/modules/ngx_kqueue_module.c index 54e9474ab..f7dee180e 100644 --- a/src/event/modules/ngx_kqueue_module.c +++ b/src/event/modules/ngx_kqueue_module.c @@ -18,7 +18,7 @@ #error "kqueue is not supported on this platform" #endif -static void ngx_add_timer(ngx_event_t *ev, u_int timer); +static void ngx_add_timer_core(ngx_event_t *ev, u_int timer); static void ngx_inline ngx_del_timer(ngx_event_t *ev); @@ -35,9 +35,11 @@ void ngx_kqueue_init(int max_connections, ngx_log_t *log) nchanges = 0; nevents = 512; - if ((kq = kqueue()) == -1) + if ((kq = kqueue()) == -1) { ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, - "ngx_kqueue_init: kqueue failed"); + "kqueue() failed"); + exit(1); + } change_list = ngx_alloc(size, log); event_list = ngx_alloc(size, log); @@ -56,7 +58,7 @@ void ngx_kqueue_init(int max_connections, ngx_log_t *log) int ngx_kqueue_add_event(ngx_event_t *ev, int event, u_int flags) { if (event == NGX_TIMER_EVENT) { - ngx_add_timer(ev, flags); + ngx_add_timer_core(ev, flags); return 0; } @@ -154,8 +156,14 @@ int ngx_kqueue_process_events(ngx_log_t *log) delta -= ev->timer_delta; nx = ev->timer_next; ngx_del_timer(ev); +#if 1 + ev->timedout = 1; + if (ev->event_handler(ev) == -1) + ev->close_handler(ev); +#else if (ev->timer_handler(ev) == -1) ev->close_handler(ev); +#endif ev = nx; } @@ -207,7 +215,7 @@ int ngx_kqueue_process_events(ngx_log_t *log) return 0; } -static void ngx_add_timer(ngx_event_t *ev, u_int timer) +static void ngx_add_timer_core(ngx_event_t *ev, u_int timer) { ngx_event_t *e; diff --git a/src/event/modules/ngx_select_module.c b/src/event/modules/ngx_select_module.c index 6c9e8f3c2..bde14a1e4 100644 --- a/src/event/modules/ngx_select_module.c +++ b/src/event/modules/ngx_select_module.c @@ -23,7 +23,7 @@ static ngx_event_t event_queue; static ngx_event_t timer_queue; -static void ngx_add_timer(ngx_event_t *ev, u_int timer); +static void ngx_add_timer_core(ngx_event_t *ev, u_int timer); static void ngx_inline ngx_del_timer(ngx_event_t *ev); static fd_set *ngx_select_get_fd_set(ngx_socket_t fd, int event, @@ -31,19 +31,17 @@ static fd_set *ngx_select_get_fd_set(ngx_socket_t fd, int event, void ngx_select_init(int max_connections, ngx_log_t *log) { -#if (WIN32) - if (max_connections > FD_SETSIZE) + if (max_connections > FD_SETSIZE) { ngx_log_error(NGX_LOG_EMERG, log, 0, - "ngx_select_init: maximum number of descriptors " - "supported by select() is %d", - FD_SETSIZE); +#if (WIN32) + "maximum number of descriptors " + "supported by select() is %d", FD_SETSIZE); #else - if (max_connections >= FD_SETSIZE) - ngx_log_error(NGX_LOG_EMERG, log, 0, - "ngx_select_init: maximum descriptor number" - "supported by select() is %d", - FD_SETSIZE - 1); + "maximum descriptor number" + "supported by select() is %d", FD_SETSIZE - 1); #endif + exit(1); + } FD_ZERO(&master_read_fds); FD_ZERO(&master_write_fds); @@ -71,7 +69,7 @@ int ngx_select_add_event(ngx_event_t *ev, int event, u_int flags) ngx_connection_t *cn = (ngx_connection_t *) ev->data; if (event == NGX_TIMER_EVENT) { - ngx_add_timer(ev, flags); + ngx_add_timer_core(ev, flags); return 0; } @@ -271,8 +269,14 @@ int ngx_select_process_events(ngx_log_t *log) delta -= ev->timer_delta; nx = ev->timer_next; ngx_del_timer(ev); +#if 1 + ev->timedout = 1; + if (ev->event_handler(ev) == -1) + ev->close_handler(ev); +#else if (ev->timer_handler(ev) == -1) ev->close_handler(ev); +#endif ev = nx; } @@ -316,7 +320,7 @@ int ngx_select_process_events(ngx_log_t *log) return 0; } -static void ngx_add_timer(ngx_event_t *ev, u_int timer) +static void ngx_add_timer_core(ngx_event_t *ev, u_int timer) { ngx_event_t *e; diff --git a/src/event/ngx_event.c b/src/event/ngx_event.c index 57c3c1ca7..a5cdb1142 100644 --- a/src/event/ngx_event.c +++ b/src/event/ngx_event.c @@ -46,15 +46,15 @@ void ngx_pre_thread(ngx_array_t *ls, ngx_pool_t *pool, ngx_log_t *log) int i, fd; ngx_listen_t *s; - /* per group */ + /* STUB */ int max_connections = 512; ngx_init_events(max_connections, log); + ngx_connections = ngx_alloc(sizeof(ngx_connection_t) + * max_connections, log); ngx_read_events = ngx_alloc(sizeof(ngx_event_t) * max_connections, log); ngx_write_events = ngx_alloc(sizeof(ngx_event_t) * max_connections, log); - ngx_connections = ngx_alloc(sizeof(ngx_connection_t) - * max_connections, log); /* for each listening socket */ s = (ngx_listen_t *) ls->elts; @@ -62,16 +62,23 @@ void ngx_pre_thread(ngx_array_t *ls, ngx_pool_t *pool, ngx_log_t *log) fd = s[i].fd; - ngx_memzero(&ngx_read_events[fd], sizeof(ngx_event_t)); - ngx_memzero(&ngx_write_events[fd], sizeof(ngx_event_t)); ngx_memzero(&ngx_connections[fd], sizeof(ngx_connection_t)); + ngx_memzero(&ngx_read_events[fd], sizeof(ngx_event_t)); ngx_connections[fd].fd = fd; + ngx_connections[fd].family = s[i].family; + ngx_connections[fd].socklen = s[i].socklen; + ngx_connections[fd].sockaddr = ngx_palloc(pool, s[i].socklen); + ngx_connections[fd].addr = s[i].addr; + ngx_connections[fd].addr_text = s[i].addr_text; + ngx_connections[fd].addr_textlen = s[i].addr_textlen; + ngx_connections[fd].post_accept_timeout = s[i].post_accept_timeout; + ngx_connections[fd].server = s[i].server; - ngx_connections[fd].read = (void *) &ngx_read_events[fd].data; ngx_connections[fd].handler = s[i].handler; - ngx_read_events[fd].data = &ngx_connections[fd]; - ngx_read_events[fd].log = ngx_connections[fd].log = s[i].log; + ngx_connections[fd].log = s[i].log; + + ngx_read_events[fd].log = ngx_connections[fd].log; ngx_read_events[fd].data = &ngx_connections[fd]; ngx_read_events[fd].event_handler = &ngx_event_accept; ngx_read_events[fd].listening = 1; @@ -79,7 +86,7 @@ void ngx_pre_thread(ngx_array_t *ls, ngx_pool_t *pool, ngx_log_t *log) ngx_read_events[fd].available = 0; #if (HAVE_DEFERRED_ACCEPT) - ngx_read_events[fd].accept_filter = s[i].accept_filter; + ngx_read_events[fd].deferred_accept = s[i].deferred_accept; #endif ngx_add_event(&ngx_read_events[fd], NGX_READ_EVENT, 0); } diff --git a/src/event/ngx_event.h b/src/event/ngx_event.h index 7daaa869a..d2e6c1f67 100644 --- a/src/event/ngx_event.h +++ b/src/event/ngx_event.h @@ -51,7 +51,7 @@ struct ngx_event_s { unsigned unexpected_eof:1; #if (HAVE_DEFERRED_ACCEPT) - unsigned accept_filter:1; + unsigned deferred_accept:1; #endif #if (HAVE_KQUEUE) unsigned eof:1; @@ -81,10 +81,12 @@ typedef struct { /* -NGX_LEVEL_EVENT (default) select, poll, kqueue +NGX_LEVEL_EVENT (default) select, poll, /dev/poll, kqueue requires to read whole data -NGX_ONESHOT_EVENT kqueue +NGX_ONESHOT_EVENT select, poll, kqueue NGX_CLEAR_EVENT kqueue +NGX_AIO_EVENT overlapped, aio_read, aioread + no need to add or delete events */ #if (HAVE_KQUEUE) @@ -93,6 +95,7 @@ NGX_CLEAR_EVENT kqueue #define NGX_WRITE_EVENT EVFILT_WRITE #define NGX_TIMER_EVENT (-EVFILT_SYSCOUNT - 1) +#define NGX_LEVEL_EVENT 0 #define NGX_ONESHOT_EVENT EV_ONESHOT #define NGX_CLEAR_EVENT EV_CLEAR @@ -102,6 +105,7 @@ NGX_CLEAR_EVENT kqueue #define NGX_WRITE_EVENT 1 #define NGX_TIMER_EVENT 2 +#define NGX_LEVEL_EVENT 0 #define NGX_ONESHOT_EVENT 1 #define NGX_CLEAR_EVENT 2 @@ -127,6 +131,8 @@ NGX_CLEAR_EVENT kqueue #endif +#define ngx_add_timer(ev, time) ngx_add_event(ev, NGX_TIMER_EVENT, time) + extern ngx_event_t *ngx_read_events; extern ngx_event_t *ngx_write_events; extern ngx_connection_t *ngx_connections; diff --git a/src/event/ngx_event_accept.c b/src/event/ngx_event_accept.c index e7edddb57..9db1bbdb8 100644 --- a/src/event/ngx_event_accept.c +++ b/src/event/ngx_event_accept.c @@ -1,5 +1,6 @@ #include <ngx_config.h> +#include <ngx_core.h> #include <ngx_types.h> #include <ngx_log.h> #include <ngx_connection.h> @@ -22,21 +23,22 @@ int ngx_event_accept(ngx_event_t *ev) ev->ready = 0; do { - if ((s = accept(cn->fd, (struct sockaddr *) &addr, &addrlen)) == -1) { + if ((s = accept(cn->fd, cn->sockaddr, &cn->socklen)) == -1) { err = ngx_socket_errno; if (err == NGX_EAGAIN) { ngx_log_error(NGX_LOG_INFO, ev->log, err, - "ngx_event_accept: EAGAIN while accept"); - return 0; + "ngx_event_accept: EAGAIN while accept %s", + cn->addr_text); + return NGX_OK; } - + ngx_log_error(NGX_LOG_ERR, ev->log, err, - "ngx_event_accept: accept failed"); - /* if we return -1 listen socket would be closed */ - return 0; + "ngx_event_accept: accept %s failed", cn->addr_text); + /* if we return NGX_ERROR listen socket would be closed */ + return NGX_OK; } - - ngx_log_debug(ev->log, "ngx_event_accept: accepted socket: %d" _ s); + + ngx_log_debug(ev->log, "ngx_event_accept: accept: %d" _ s); #if !(HAVE_INHERITED_NONBLOCK) if (ngx_nonblocking(s) == -1) @@ -48,6 +50,13 @@ int ngx_event_accept(ngx_event_t *ev) ngx_memzero(&ngx_write_events[s], sizeof(ngx_event_t)); ngx_memzero(&ngx_connections[s], sizeof(ngx_connection_t)); + ngx_connections[s].sockaddr = cn->sockaddr; + ngx_connections[s].family = cn->family; + ngx_connections[s].socklen = cn->socklen; + ngx_connections[s].addr = cn->addr; + ngx_connections[s].addr_textlen = cn->addr_textlen; + ngx_connections[s].post_accept_timeout = cn->post_accept_timeout; + ngx_read_events[s].data = ngx_write_events[s].data = &ngx_connections[s]; ngx_connections[s].read = &ngx_read_events[s]; @@ -60,16 +69,16 @@ int ngx_event_accept(ngx_event_t *ev) ngx_write_events[s].timer = ngx_read_events[s].timer = 10000; ngx_write_events[s].timer_handler = - ngx_read_events[s].timer_handler = ngx_event_close; + ngx_read_events[s].timer_handler = ngx_event_close_connection; ngx_write_events[s].close_handler = - ngx_read_events[s].close_handler = ngx_event_close; + ngx_read_events[s].close_handler = ngx_event_close_connection; ngx_connections[s].server = cn->server; ngx_connections[s].servers = cn->servers; ngx_connections[s].log = ngx_read_events[s].log = ngx_write_events[s].log = ev->log; - + #if (HAVE_DEFERRED_ACCEPT) if (ev->accept_filter) ngx_read_events[s].ready = 1; diff --git a/src/event/ngx_event_close.c b/src/event/ngx_event_close.c index 270855a5d..c95689182 100644 --- a/src/event/ngx_event_close.c +++ b/src/event/ngx_event_close.c @@ -5,7 +5,7 @@ #include <ngx_event_close.h> -int ngx_event_close(ngx_event_t *ev) +int ngx_event_close_connection(ngx_event_t *ev) { int rc; ngx_connection_t *cn = (ngx_connection_t *) ev->data; diff --git a/src/event/ngx_event_close.h b/src/event/ngx_event_close.h index 90c6512d3..54a048df4 100644 --- a/src/event/ngx_event_close.h +++ b/src/event/ngx_event_close.h @@ -4,7 +4,7 @@ #include <ngx_event.h> -int ngx_event_close(ngx_event_t *ev); +int ngx_event_close_connection(ngx_event_t *ev); #endif /* _NGX_EVENT_CLOSE_H_INCLUDED_ */ diff --git a/src/event/ngx_event_recv.c b/src/event/ngx_event_recv.c index 1874b913f..e286acaa9 100644 --- a/src/event/ngx_event_recv.c +++ b/src/event/ngx_event_recv.c @@ -14,6 +14,12 @@ int ngx_event_recv_core(ngx_event_t *ev, char *buf, size_t size) c = (ngx_connection_t *) ev->data; + if (ev->timedout) { + ngx_set_socket_errno(NGX_ETIMEDOUT); + ngx_log_error(NGX_LOG_ERR, ev->log, NGX_ETIMEDOUT, "recv() failed"); + return NGX_ERROR; + } + #if (HAVE_KQUEUE) ngx_log_debug(ev->log, "ngx_event_recv: eof:%d, avail:%d, err:%d" _ ev->eof _ ev->available _ ev->error); @@ -22,10 +28,7 @@ int ngx_event_recv_core(ngx_event_t *ev, char *buf, size_t size) #endif if (ev->eof && ev->available == 0) { if (ev->error) { - ngx_log_error(NGX_LOG_ERR, ev->log, ev->error, - "ngx_event_recv: recv() failed while %s", - ev->log->action); - + ngx_log_error(NGX_LOG_ERR, ev->log, ev->error, "recv() failed"); return NGX_ERROR; } @@ -39,16 +42,11 @@ int ngx_event_recv_core(ngx_event_t *ev, char *buf, size_t size) err = ngx_socket_errno; if (err == NGX_EAGAIN) { - ngx_log_error(NGX_LOG_INFO, ev->log, err, - "ngx_event_recv: recv() returns EAGAIN while %s", - ev->log->action); + ngx_log_error(NGX_LOG_INFO, ev->log, err, "recv() returns EAGAIN"); return NGX_AGAIN; } - ngx_log_error(NGX_LOG_INFO, ev->log, err, - "ngx_event_recv: recv() failed while %s", - ev->log->action); - + ngx_log_error(NGX_LOG_ERR, ev->log, err, "recv() failed"); return NGX_ERROR; } |
