nginx-0.0.1-2003-10-12-20:49:16 import
diff --git a/src/event/modules/ngx_aio_module.c b/src/event/modules/ngx_aio_module.c index cdfb1b0..4b89c2a 100644 --- a/src/event/modules/ngx_aio_module.c +++ b/src/event/modules/ngx_aio_module.c
@@ -68,7 +68,7 @@ ngx_io = ngx_os_aio; - ngx_event_flags = NGX_HAVE_AIO_EVENT|NGX_USE_AIO_EVENT; + ngx_event_flags = NGX_USE_AIO_EVENT; ngx_event_actions = ngx_aio_module_ctx.actions;
diff --git a/src/event/modules/ngx_devpoll_module.c b/src/event/modules/ngx_devpoll_module.c index e55f17c..c21abde 100644 --- a/src/event/modules/ngx_devpoll_module.c +++ b/src/event/modules/ngx_devpoll_module.c
@@ -173,7 +173,7 @@ ngx_event_actions = ngx_devpoll_module_ctx.actions; - ngx_event_flags = NGX_HAVE_LEVEL_EVENT|NGX_USE_LEVEL_EVENT; + ngx_event_flags = NGX_USE_LEVEL_EVENT; return NGX_OK; }
diff --git a/src/event/modules/ngx_iocp_module.c b/src/event/modules/ngx_iocp_module.c index 2f31eb6..86d763b 100644 --- a/src/event/modules/ngx_iocp_module.c +++ b/src/event/modules/ngx_iocp_module.c
@@ -105,7 +105,7 @@ ngx_event_actions = ngx_iocp_module_ctx.actions; - ngx_event_flags = NGX_HAVE_AIO_EVENT|NGX_HAVE_IOCP_EVENT; + ngx_event_flags = NGX_USE_AIO_EVENT|NGX_USE_IOCP_EVENT; return NGX_OK; }
diff --git a/src/event/modules/ngx_kqueue_module.c b/src/event/modules/ngx_kqueue_module.c index d0a9d2e..14eb270 100644 --- a/src/event/modules/ngx_kqueue_module.c +++ b/src/event/modules/ngx_kqueue_module.c
@@ -151,10 +151,9 @@ ngx_event_actions = ngx_kqueue_module_ctx.actions; - ngx_event_flags = NGX_HAVE_LEVEL_EVENT - |NGX_HAVE_ONESHOT_EVENT + ngx_event_flags = NGX_USE_ONESHOT_EVENT #if (HAVE_CLEAR_EVENT) - |NGX_HAVE_CLEAR_EVENT + |NGX_USE_CLEAR_EVENT #else |NGX_USE_LEVEL_EVENT #endif @@ -238,9 +237,11 @@ return NGX_OK; } - /* when the file descriptor is closed a kqueue automatically deletes - its filters so we do not need to delete explicity the event - before the closing the file descriptor */ + /* + * when the file descriptor is closed a kqueue automatically deletes + * its filters so we do not need to delete explicity the event + * before the closing the file descriptor. + */ if (flags & NGX_CLOSE_EVENT) { return NGX_OK; @@ -427,13 +428,17 @@ if (ev->oneshot && ev->timer_set) { ngx_del_timer(ev); - ev->timer_set = 0; } - /* fall through */ + ev->ready = 1; + + ev->event_handler(ev); + + break; case EVFILT_AIO: ev->ready = 1; + ev->active = 0; ev->event_handler(ev);
diff --git a/src/event/modules/ngx_poll_module.c b/src/event/modules/ngx_poll_module.c index 4d50b4a..9d2f8ac 100644 --- a/src/event/modules/ngx_poll_module.c +++ b/src/event/modules/ngx_poll_module.c
@@ -109,9 +109,7 @@ ngx_event_actions = ngx_poll_module_ctx.actions; - ngx_event_flags = NGX_HAVE_LEVEL_EVENT - |NGX_HAVE_ONESHOT_EVENT - |NGX_USE_LEVEL_EVENT; + ngx_event_flags = NGX_USE_LEVEL_EVENT|NGX_USE_ONESHOT_EVENT; return NGX_OK; } @@ -364,7 +362,6 @@ if (ev->oneshot) { if (ev->timer_set) { ngx_del_timer(ev); - ev->timer_set = 0; } if (ev->write) {
diff --git a/src/event/modules/ngx_select_module.c b/src/event/modules/ngx_select_module.c index 1f8a5d9..7924766 100644 --- a/src/event/modules/ngx_select_module.c +++ b/src/event/modules/ngx_select_module.c
@@ -108,9 +108,7 @@ ngx_event_actions = ngx_select_module_ctx.actions; - ngx_event_flags = NGX_HAVE_LEVEL_EVENT - |NGX_HAVE_ONESHOT_EVENT - |NGX_USE_LEVEL_EVENT; + ngx_event_flags = NGX_USE_LEVEL_EVENT|NGX_USE_ONESHOT_EVENT; #if (WIN32) max_read = max_write = 0; @@ -401,7 +399,6 @@ if (ev->oneshot) { if (ev->timer_set) { ngx_del_timer(ev); - ev->timer_set = 0; } if (ev->write) {
diff --git a/src/event/ngx_event.c b/src/event/ngx_event.c index 7c709e3..71bf45d 100644 --- a/src/event/ngx_event.c +++ b/src/event/ngx_event.c
@@ -224,7 +224,7 @@ /* required by poll */ wev->index = NGX_INVALID_INDEX; - if ((ngx_event_flags & NGX_HAVE_IOCP_EVENT) == 0) { + if ((ngx_event_flags & NGX_USE_IOCP_EVENT) == 0) { if (s[i].remain) { if (ngx_del_event(&cycle->old_cycle->read_events[fd], @@ -238,7 +238,7 @@ #if (WIN32) - if (ngx_event_flags & NGX_HAVE_IOCP_EVENT) { + if (ngx_event_flags & NGX_USE_IOCP_EVENT) { rev->event_handler = &ngx_event_acceptex; if (ngx_add_event(rev, 0, NGX_IOCP_ACCEPT) == NGX_ERROR) {
diff --git a/src/event/ngx_event.h b/src/event/ngx_event.h index 8bb2017..643ea2b 100644 --- a/src/event/ngx_event.h +++ b/src/event/ngx_event.h
@@ -24,9 +24,6 @@ void *data; void (*event_handler)(ngx_event_t *ev); -#if 0 - int (*close_handler)(ngx_event_t *ev); -#endif void *context; char *action; @@ -35,9 +32,6 @@ ngx_event_t *prev; /* queue in mutex(), aio_read(), aio_write() */ ngx_event_t *next; /* */ -#if 0 - int (*timer_handler)(ngx_event_t *ev); -#endif ngx_event_t *timer_prev; ngx_event_t *timer_next; @@ -61,17 +55,26 @@ #endif unsigned write:1; - unsigned instance:1; /* used to detect stale events in kqueue, - rt signals and epoll */ + /* used to detect stale events in kqueue, rt signals and epoll */ + unsigned instance:1; + /* + * event was passed or would be passed to a kernel; + * the posted aio operation. + */ unsigned active:1; + + /* ready event; the complete aio operation */ unsigned ready:1; + unsigned timedout:1; - unsigned blocked:1; unsigned timer_set:1; + +#if 1 + unsigned blocked:1; +#endif unsigned delayed:1; - unsigned process:1; unsigned read_discarded:1; unsigned ignore_econnreset:1; @@ -156,50 +159,68 @@ } ngx_event_actions_t; -/* The event filter requires to read/write the whole data - - select, poll, /dev/poll, kqueue. */ -#define NGX_HAVE_LEVEL_EVENT 0x00000001 +/* + * The event filter requires to read/write the whole data - + * select, poll, /dev/poll, kqueue. + */ +#define NGX_USE_LEVEL_EVENT 0x00000001 -/* The event filter is deleted after a notification without an additional - syscall - select, poll, kqueue. */ -#define NGX_HAVE_ONESHOT_EVENT 0x00000002 +/* + * The event filter is deleted after a notification without an additional + * syscall - select, poll, kqueue. + */ +#define NGX_USE_ONESHOT_EVENT 0x00000002 -/* The event filter notifies only the changes and an initial level - kqueue */ -#define NGX_HAVE_CLEAR_EVENT 0x00000004 +/* + * The event filter notifies only the changes and an initial level - kqueue. + */ +#define NGX_USE_CLEAR_EVENT 0x00000004 -/* The event filter has kqueue features - the eof flag, errno, - available data, etc */ -#define NGX_HAVE_KQUEUE_EVENT 0x00000008 +/* + * The event filter has kqueue features - the eof flag, errno, + * available data, etc + */ +#define NGX_HAVE_KQUEUE_EVENT 0x00000008 -/* The event filter supports low water mark - kqueue's NOTE_LOWAT. - kqueue in FreeBSD 4.1-4.2 has no NOTE_LOWAT so we need a separate flag */ -#define NGX_HAVE_LOWAT_EVENT 0x00000010 +/* + * The event filter supports low water mark - kqueue's NOTE_LOWAT. + * kqueue in FreeBSD 4.1-4.2 has no NOTE_LOWAT so we need a separate flag. + */ +#define NGX_HAVE_LOWAT_EVENT 0x00000010 -/* The event filter notifies only the changes (the edges) - but not an initial level - epoll */ -#define NGX_HAVE_EDGE_EVENT 0x00000020 +/* + * The event filter notifies only the changes (the edges) + * but not an initial level - epoll. + */ +#define NGX_USE_EDGE_EVENT 0x00000020 -/* No need to add or delete the event filters - rt signals */ -#define NGX_HAVE_SIGIO_EVENT 0x00000040 +/* + * No need to add or delete the event filters - rt signals. + */ +#define NGX_USE_SIGIO_EVENT 0x00000040 -/* No need to add or delete the event filters - overlapped, aio_read, aioread */ -#define NGX_HAVE_AIO_EVENT 0x00000080 +/* + * No need to add or delete the event filters - overlapped, aio_read, + * aioread, io_submit. + */ +#define NGX_USE_AIO_EVENT 0x00000080 -/* Need to add socket or handle only once - i/o completion port. - It also requires HAVE_AIO_EVENT and NGX_HAVE_AIO_EVENT to be set */ -#define NGX_HAVE_IOCP_EVENT 0x00000100 +/* + * Need to add socket or handle only once - i/o completion port. + * It also requires HAVE_AIO_EVENT and NGX_HAVE_AIO_EVENT to be set. + */ +#define NGX_USE_IOCP_EVENT 0x00000100 -#define NGX_USE_LEVEL_EVENT 0x00010000 -#define NGX_USE_AIO_EVENT 0x00020000 - -/* Event filter is deleted before closing file. - Has no meaning for select, poll, epoll. - - kqueue: kqueue deletes event filters for file that closed - so we need only to delete filters in user-level batch array - /dev/poll: we need to flush POLLREMOVE event before closing file */ +/* + * The event filter is deleted before the closing file. + * Has no meaning for select, poll, epoll. + * + * kqueue: kqueue deletes event filters for file that closed + * so we need only to delete filters in user-level batch array + * /dev/poll: we need to flush POLLREMOVE event before closing file + */ #define NGX_CLOSE_EVENT 1 @@ -209,10 +230,12 @@ #define NGX_READ_EVENT EVFILT_READ #define NGX_WRITE_EVENT EVFILT_WRITE -/* NGX_CLOSE_EVENT is the module flag and it would not go into a kernel - so we need to choose the value that would not interfere with any existent - and future flags. kqueue has such values - EV_FLAG1, EV_EOF and EV_ERROR. - They are reserved and cleared on a kernel entrance */ +/* + * NGX_CLOSE_EVENT is the module flag and it would not go into a kernel + * so we need to choose the value that would not interfere with any existent + * and future flags. kqueue has such values - EV_FLAG1, EV_EOF and EV_ERROR. + * They are reserved and cleared on a kernel entrance. + */ #undef NGX_CLOSE_EVENT #define NGX_CLOSE_EVENT EV_FLAG1 @@ -383,14 +406,14 @@ ngx_inline static int ngx_handle_read_event(ngx_event_t *rev) { - if (ngx_event_flags & (NGX_HAVE_AIO_EVENT|NGX_HAVE_EDGE_EVENT)) { + if (ngx_event_flags & (NGX_USE_AIO_EVENT|NGX_USE_EDGE_EVENT)) { /* aio, iocp, epoll */ return NGX_OK; } - if (ngx_event_flags & NGX_HAVE_CLEAR_EVENT) { + if (ngx_event_flags & NGX_USE_CLEAR_EVENT) { /* kqueue */ @@ -426,16 +449,41 @@ } +ngx_inline static int ngx_handle_level_read_event(ngx_event_t *rev) +{ + if (ngx_event_flags & NGX_USE_LEVEL_EVENT) { + if (!rev->active && !rev->ready) { + if (ngx_add_event(rev, NGX_READ_EVENT, NGX_LEVEL_EVENT) + == NGX_ERROR) { + return NGX_ERROR; + } + + return NGX_OK; + } + + if (rev->active && rev->ready) { + if (ngx_del_event(rev, NGX_READ_EVENT, 0) == NGX_ERROR) { + return NGX_ERROR; + } + + return NGX_OK; + } + } + + return NGX_OK; +} + + ngx_inline static int ngx_handle_write_event(ngx_event_t *wev, int lowat) { - if (ngx_event_flags & (NGX_HAVE_AIO_EVENT|NGX_HAVE_EDGE_EVENT)) { + if (ngx_event_flags & (NGX_USE_AIO_EVENT|NGX_USE_EDGE_EVENT)) { /* aio, iocp, epoll */ return NGX_OK; } - if (ngx_event_flags & NGX_HAVE_CLEAR_EVENT) { + if (ngx_event_flags & NGX_USE_CLEAR_EVENT) { /* kqueue */ @@ -478,6 +526,30 @@ } +ngx_inline static int ngx_handle_level_write_event(ngx_event_t *wev) +{ + if (ngx_event_flags & NGX_USE_LEVEL_EVENT) { + if (!wev->active && !wev->ready) { + if (ngx_add_event(wev, NGX_WRITE_EVENT, NGX_LEVEL_EVENT) + == NGX_ERROR) { + return NGX_ERROR; + } + + return NGX_OK; + } + + if (wev->active && wev->ready) { + if (ngx_del_event(wev, NGX_WRITE_EVENT, 0) == NGX_ERROR) { + return NGX_ERROR; + } + + return NGX_OK; + } + } + + return NGX_OK; +} + /* ***************************** */
diff --git a/src/event/ngx_event_close.c b/src/event/ngx_event_close.c index 06e9117..c57c195 100644 --- a/src/event/ngx_event_close.c +++ b/src/event/ngx_event_close.c
@@ -20,12 +20,10 @@ if (c->read->timer_set) { ngx_del_timer(c->read); - c->read->timer_set = 0; } if (c->write->timer_set) { ngx_del_timer(c->write); - c->write->timer_set = 0; } ngx_del_event(c->read, NGX_READ_EVENT, NGX_CLOSE_EVENT);
diff --git a/src/event/ngx_event_connect.c b/src/event/ngx_event_connect.c index 72031d9..b2b70d4 100644 --- a/src/event/ngx_event_connect.c +++ b/src/event/ngx_event_connect.c
@@ -202,7 +202,7 @@ /* TODO: epoll, aio, iocp */ - if (ngx_event_flags & NGX_HAVE_CLEAR_EVENT) { /* kqueue */ + if (ngx_event_flags & NGX_USE_CLEAR_EVENT) { /* kqueue */ event = NGX_CLEAR_EVENT; } else { /* select, poll, /dev/poll */
diff --git a/src/event/ngx_event_proxy.c b/src/event/ngx_event_proxy.c index 71bae95..b49b6b9 100644 --- a/src/event/ngx_event_proxy.c +++ b/src/event/ngx_event_proxy.c
@@ -584,7 +584,7 @@ int ngx_event_proxy_write_chain_to_temp_file(ngx_event_proxy_t *p) { - int i, rc, size; + int rc, size; ngx_hunk_t *h; ngx_chain_t *entry, *next, *saved_in, *saved_read;
diff --git a/src/event/ngx_event_timer.c b/src/event/ngx_event_timer.c index b70bafb..53ca9cd 100644 --- a/src/event/ngx_event_timer.c +++ b/src/event/ngx_event_timer.c
@@ -4,7 +4,7 @@ #include <ngx_event.h> -/* in multithreaded enviroment all timer operations must be +/* TODO: in multithreaded enviroment all timer operations must be protected by the single mutex */ @@ -70,11 +70,18 @@ void ngx_event_add_timer(ngx_event_t *ev, ngx_msec_t timer) { ngx_event_t *e, *queue; +#if (NGX_DEBUG_EVENT) + ngx_connection_t *c; +#endif + + if (ev->timer_set) { + ngx_del_timer(ev); + } #if (NGX_DEBUG_EVENT) - ngx_connection_t *c = ev->data; - ngx_log_debug(ev->log, "set timer: %d:%d, slot: %d" _ - c->fd _ timer _ ngx_timer_cur_queue); + c = ev->data; + ngx_log_debug(ev->log, "set timer: %d:%d:%d, slot: %d" _ + c->fd _ ev->write _ timer _ ngx_timer_cur_queue); #endif if (ev->timer_next || ev->timer_prev) { @@ -107,6 +114,10 @@ e->timer_prev->timer_next = ev; e->timer_prev = ev; + + ev->timer_set = 1; + + return; } @@ -129,9 +140,9 @@ if (timer == NGX_MAX_MSEC) { return 0; - } else { - return timer; } + + return timer; } @@ -190,6 +201,10 @@ timer += ngx_temp_timer_queue.timer_next->timer_delta; ev = ngx_temp_timer_queue.timer_next; +#if (NGX_DEBUG_EVENT) + ngx_log_debug(ev->log, "process temp timer queue"); +#endif + ngx_del_timer(ev); ngx_add_timer(ev, timer); }
diff --git a/src/event/ngx_event_timer.h b/src/event/ngx_event_timer.h index 7a6c52c..565b233 100644 --- a/src/event/ngx_event_timer.h +++ b/src/event/ngx_event_timer.h
@@ -19,7 +19,7 @@ { #if (NGX_DEBUG_EVENT) ngx_connection_t *c = ev->data; - ngx_log_debug(ev->log, "del timer: %d" _ c->fd); + ngx_log_debug(ev->log, "del timer: %d:%d" _ c->fd _ ev->write); #endif if (!ev->timer_next || !ev->timer_prev) { @@ -40,6 +40,8 @@ if (ev->timer_prev) { ev->timer_prev = NULL; } + + ev->timer_set = 0; }