diff options
| author | Igor Sysoev <igor@sysoev.ru> | 2003-11-25 20:44:56 +0000 |
|---|---|---|
| committer | Igor Sysoev <igor@sysoev.ru> | 2003-11-25 20:44:56 +0000 |
| commit | a8fa0a6a37b6e90324e0dcbf4733324199623841 (patch) | |
| tree | 1a7edec9aa04946afc22299bf587823488fb492f /src/event | |
| parent | d9d0ca12688034d481e2f1f5cf13a098338ec31d (diff) | |
| download | nginx-a8fa0a6a37b6e90324e0dcbf4733324199623841.tar.gz nginx-a8fa0a6a37b6e90324e0dcbf4733324199623841.tar.bz2 | |
nginx-0.0.1-2003-11-25-23:44:56 import
Diffstat (limited to 'src/event')
| -rw-r--r-- | src/event/modules/ngx_kqueue_module.c | 70 | ||||
| -rw-r--r-- | src/event/ngx_event.h | 19 | ||||
| -rw-r--r-- | src/event/ngx_event_connect.h | 2 | ||||
| -rw-r--r-- | src/event/ngx_event_timer.c | 75 | ||||
| -rw-r--r-- | src/event/ngx_event_timer.h | 1 | ||||
| -rw-r--r-- | src/event/ngx_event_write.c | 203 | ||||
| -rw-r--r-- | src/event/ngx_event_write.h | 13 | ||||
| -rw-r--r-- | src/event/ngx_event_wsarecv.c | 4 |
8 files changed, 145 insertions, 242 deletions
diff --git a/src/event/modules/ngx_kqueue_module.c b/src/event/modules/ngx_kqueue_module.c index f51886e1e..1f069792a 100644 --- a/src/event/modules/ngx_kqueue_module.c +++ b/src/event/modules/ngx_kqueue_module.c @@ -190,6 +190,7 @@ static void ngx_kqueue_done(ngx_cycle_t *cycle) static int ngx_kqueue_add_event(ngx_event_t *ev, int event, u_int flags) { + ngx_event_t *e; ngx_connection_t *c; ev->active = 1; @@ -200,6 +201,28 @@ static int ngx_kqueue_add_event(ngx_event_t *ev, int event, u_int flags) && ((uintptr_t) change_list[ev->index].udata & (uintptr_t) ~1) == (uintptr_t) ev) { + if (change_list[ev->index].flags == EV_DISABLE) { + +#if (NGX_DEBUG_EVENT) + ngx_connection_t *c = (ngx_connection_t *) ev->data; + ngx_log_debug(ev->log, "kqueue event activated: %d: ft:%d" _ + c->fd _ event); +#endif + + /* + * if the EV_DISABLE is still not passed to a kernel + * we will not pass it + */ + + if (ev->index < (u_int) --nchanges) { + e = (ngx_event_t *) change_list[nchanges].udata; + change_list[ev->index] = change_list[nchanges]; + e->index = ev->index; + } + + return NGX_OK; + } + c = ev->data; ngx_log_error(NGX_LOG_ALERT, ev->log, 0, "previous event on #%d were not passed in kernel", c->fd); @@ -207,7 +230,7 @@ static int ngx_kqueue_add_event(ngx_event_t *ev, int event, u_int flags) return NGX_ERROR; } - return ngx_kqueue_set_event(ev, event, EV_ADD|flags); + return ngx_kqueue_set_event(ev, event, EV_ADD|EV_ENABLE|flags); } @@ -286,23 +309,26 @@ static int ngx_kqueue_set_event(ngx_event_t *ev, int filter, u_int flags) change_list[nchanges].flags = flags; change_list[nchanges].udata = (void *) ((uintptr_t) ev | ev->instance); -#if (HAVE_LOWAT_EVENT) - - if (flags & NGX_LOWAT_EVENT) { - change_list[nchanges].fflags = NOTE_LOWAT; - change_list[nchanges].data = ev->available; + if (filter == EVFILT_VNODE) { + change_list[nchanges].fflags = NOTE_DELETE|NOTE_WRITE|NOTE_EXTEND + |NOTE_ATTRIB|NOTE_RENAME|NOTE_REVOKE; + change_list[nchanges].data = 0; } else { - change_list[nchanges].fflags = 0; - change_list[nchanges].data = 0; - } +#if (HAVE_LOWAT_EVENT) + if (flags & NGX_LOWAT_EVENT) { + change_list[nchanges].fflags = NOTE_LOWAT; + change_list[nchanges].data = ev->available; + } else { + change_list[nchanges].fflags = 0; + change_list[nchanges].data = 0; + } #else - - change_list[nchanges].fflags = 0; - change_list[nchanges].data = 0; - + change_list[nchanges].fflags = 0; + change_list[nchanges].data = 0; #endif + } ev->index = nchanges; @@ -365,12 +391,16 @@ static int ngx_kqueue_process_events(ngx_log_t *log) ngx_log_debug(log, "kevent timer: %d, delta: %d" _ timer _ (int) delta); #endif +#if 0 /* * The expired timers must be handled before a processing of the events * because the new timers can be added during a processing */ ngx_event_expire_timers((ngx_msec_t) delta); +#endif + + ngx_event_set_timer_delta((ngx_msec_t) delta); } else { if (events == 0) { @@ -452,6 +482,13 @@ static int ngx_kqueue_process_events(ngx_log_t *log) break; + case EVFILT_VNODE: + ev->kq_vnode = 1; + + ev->event_handler(ev); + + break; + case EVFILT_AIO: ev->complete = 1; ev->ready = 1; @@ -463,10 +500,15 @@ static int ngx_kqueue_process_events(ngx_log_t *log) default: ngx_log_error(NGX_LOG_ALERT, log, 0, - "unexpected kevent filter %d" _ event_list[i].filter); + "unexpected kevent() filter %d", + event_list[i].filter); } } + if (timer) { + ngx_event_expire_timers((ngx_msec_t) delta); + } + return NGX_OK; } diff --git a/src/event/ngx_event.h b/src/event/ngx_event.h index 48ef29beb..42c0ed50e 100644 --- a/src/event/ngx_event.h +++ b/src/event/ngx_event.h @@ -107,6 +107,8 @@ struct ngx_event_s { #endif #if (HAVE_KQUEUE) + unsigned kq_vnode:1; + /* the pending errno reported by kqueue */ int kq_errno; #endif @@ -212,7 +214,7 @@ extern ngx_event_actions_t ngx_event_actions; /* * 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. + * It also requires HAVE_AIO and NGX_USE_AIO_EVENT to be set. */ #define NGX_USE_IOCP_EVENT 0x00000100 @@ -233,6 +235,7 @@ extern ngx_event_actions_t ngx_event_actions; /* these flags have a meaning only for kqueue */ #define NGX_LOWAT_EVENT 0 #define NGX_DISABLE_EVENT 0 +#define NGX_VNODE_EVENT 0 #if (HAVE_KQUEUE) @@ -240,6 +243,9 @@ extern ngx_event_actions_t ngx_event_actions; #define NGX_READ_EVENT EVFILT_READ #define NGX_WRITE_EVENT EVFILT_WRITE +#undef NGX_VNODE_EVENT +#define NGX_VNODE_EVENT EVFILT_VNODE + /* * NGX_CLOSE_EVENT and NGX_LOWAT_EVENT are the module flags and they would * not go into a kernel so we need to choose the value that would not interfere @@ -289,7 +295,7 @@ extern ngx_event_actions_t ngx_event_actions; #endif /* HAVE_KQUEUE */ -#if (HAVE_IOCP_EVENT) +#if (HAVE_IOCP) #define NGX_IOCP_ACCEPT 0 #define NGX_IOCP_IO 1 #define NGX_IOCP_CONNECT 2 @@ -444,7 +450,8 @@ ngx_inline static int ngx_handle_write_event(ngx_event_t *wev, u_int flags) if (!wev->active && !wev->ready) { if (ngx_add_event(wev, NGX_WRITE_EVENT, NGX_CLEAR_EVENT|flags) - == NGX_ERROR) { + == NGX_ERROR) + { return NGX_ERROR; } } @@ -457,7 +464,8 @@ ngx_inline static int ngx_handle_write_event(ngx_event_t *wev, u_int flags) if (!wev->active && !wev->ready) { if (ngx_add_event(wev, NGX_WRITE_EVENT, NGX_LEVEL_EVENT) - == NGX_ERROR) { + == NGX_ERROR) + { return NGX_ERROR; } @@ -484,7 +492,8 @@ 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) { + == NGX_ERROR) + { return NGX_ERROR; } diff --git a/src/event/ngx_event_connect.h b/src/event/ngx_event_connect.h index 16068c166..eb8b64b22 100644 --- a/src/event/ngx_event_connect.h +++ b/src/event/ngx_event_connect.h @@ -11,7 +11,7 @@ typedef struct { - u_int32_t addr; + in_addr_t addr; ngx_str_t host; int port; ngx_str_t addr_port_text; diff --git a/src/event/ngx_event_timer.c b/src/event/ngx_event_timer.c index fffd5728b..8176ed1c4 100644 --- a/src/event/ngx_event_timer.c +++ b/src/event/ngx_event_timer.c @@ -8,15 +8,21 @@ protected by the single mutex */ +#if 0 static ngx_event_t *ngx_timer_queue, ngx_temp_timer_queue; +static int ngx_expire_timers; +#endif + +static ngx_event_t *ngx_timer_queue; +static ngx_msec_t *ngx_timer_delta; 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) { - int i; + ngx_int_t i; + ngx_msec_t *new_delta; ngx_event_t *new_queue; ngx_event_conf_t *ecf; @@ -38,6 +44,21 @@ int ngx_event_timer_init(ngx_cycle_t *cycle) ngx_timer_queue = new_queue; + ngx_test_null(new_delta, + ngx_calloc(ecf->timer_queues * sizeof(ngx_msec_t), + cycle->log), + NGX_ERROR); + + for (i = 0; i < ngx_timer_queue_num; i++) { + new_delta[i] = ngx_timer_delta[i]; + } + + if (ngx_timer_delta) { + ngx_free(ngx_timer_delta); + } + + ngx_timer_delta = new_delta; + ngx_timer_queue_num = ecf->timer_queues; ngx_timer_cur_queue = 0; @@ -52,8 +73,10 @@ int ngx_event_timer_init(ngx_cycle_t *cycle) exit(1); } +#if 0 ngx_temp_timer_queue.timer_prev = &ngx_temp_timer_queue; ngx_temp_timer_queue.timer_next = &ngx_temp_timer_queue; +#endif return NGX_OK;; } @@ -63,6 +86,10 @@ void ngx_event_timer_done(ngx_cycle_t *cycle) { ngx_free(ngx_timer_queue); ngx_timer_queue = NULL; + + ngx_free(ngx_timer_delta); + ngx_timer_delta = NULL; + ngx_timer_queue_num = 0; } @@ -89,6 +116,15 @@ void ngx_event_add_timer(ngx_event_t *ev, ngx_msec_t timer) return; } + queue = &ngx_timer_queue[ngx_timer_cur_queue]; + timer += ngx_timer_delta[ngx_timer_cur_queue++]; + + if (ngx_timer_cur_queue >= ngx_timer_queue_num) { + ngx_timer_cur_queue = 0; + } + + +#if 0 if (ngx_expire_timers) { queue = &ngx_temp_timer_queue; @@ -99,6 +135,7 @@ void ngx_event_add_timer(ngx_event_t *ev, ngx_msec_t timer) ngx_timer_cur_queue = 0; } } +#endif for (e = queue->timer_next; e != queue && timer > e->timer_delta; @@ -123,7 +160,7 @@ void ngx_event_add_timer(ngx_event_t *ev, ngx_msec_t timer) int ngx_event_find_timer(void) { - int i; + ngx_int_t i; ngx_msec_t timer; timer = NGX_MAX_MSEC; @@ -146,17 +183,34 @@ int ngx_event_find_timer(void) } +void ngx_event_set_timer_delta(ngx_msec_t timer) +{ + ngx_int_t i; + + for (i = 0; i < ngx_timer_queue_num; i++) { + ngx_timer_delta[i] = timer; + } +} + + +/* void ngx_event_expire_timers() */ void ngx_event_expire_timers(ngx_msec_t timer) { - int i; + ngx_int_t i; +#if 0 ngx_msec_t delta; +#endif ngx_event_t *ev; +#if 0 ngx_expire_timers = 1; +#endif for (i = 0; i < ngx_timer_queue_num; i++) { +#if 0 delta = timer; +#endif for ( ;; ) { ev = ngx_timer_queue[i].timer_next; @@ -165,12 +219,21 @@ void ngx_event_expire_timers(ngx_msec_t timer) break; } + if (ev->timer_delta > ngx_timer_delta[i]) { + ev->timer_delta -= ngx_timer_delta[i]; + break; + } + + ngx_timer_delta[i] -= ev->timer_delta; + +#if 0 if (ev->timer_delta > delta) { ev->timer_delta -= delta; break; } delta -= ev->timer_delta; +#endif ngx_del_timer(ev); @@ -186,8 +249,11 @@ void ngx_event_expire_timers(ngx_msec_t timer) ev->event_handler(ev); } + + ngx_timer_delta[i] = 0; } +#if 0 ngx_expire_timers = 0; if (ngx_temp_timer_queue.timer_next == &ngx_temp_timer_queue) { @@ -207,4 +273,5 @@ void ngx_event_expire_timers(ngx_msec_t timer) ngx_del_timer(ev); ngx_add_timer(ev, timer); } +#endif } diff --git a/src/event/ngx_event_timer.h b/src/event/ngx_event_timer.h index 565b23373..911667d14 100644 --- a/src/event/ngx_event_timer.h +++ b/src/event/ngx_event_timer.h @@ -11,6 +11,7 @@ int ngx_event_timer_init(ngx_cycle_t *cycle); void ngx_event_timer_done(ngx_cycle_t *cycle); void ngx_event_add_timer(ngx_event_t *ev, ngx_msec_t timer); int ngx_event_find_timer(void); +void ngx_event_set_timer_delta(ngx_msec_t timer); void ngx_event_expire_timers(ngx_msec_t timer); diff --git a/src/event/ngx_event_write.c b/src/event/ngx_event_write.c deleted file mode 100644 index 9e7670c5d..000000000 --- a/src/event/ngx_event_write.c +++ /dev/null @@ -1,203 +0,0 @@ - -#include <ngx_config.h> -#include <ngx_core.h> -#include <ngx_types.h> -#include <ngx_alloc.h> -#include <ngx_array.h> -#include <ngx_hunk.h> -#include <ngx_connection.h> -#include <ngx_sendv.h> -#include <ngx_sendfile.h> -#include <ngx_event_write.h> - - -ngx_chain_t *ngx_event_write(ngx_connection_t *c, ngx_chain_t *in, off_t flush) -{ - int rc, i, last; - u_int flags; - char *prev; - off_t sent; - ngx_iovec_t *iov; - ngx_array_t *header, *trailer; - ngx_hunk_t *file; - ngx_chain_t *ch; - - ch = in; - file = NULL; - last = 0; - - ngx_test_null(header, ngx_create_array(c->pool, 10, sizeof(ngx_iovec_t)), - (ngx_chain_t *) -1); - - ngx_test_null(trailer, ngx_create_array(c->pool, 10, sizeof(ngx_iovec_t)), - (ngx_chain_t *) -1); - - do { - header->nelts = 0; - trailer->nelts = 0; - - if (ch->hunk->type & NGX_HUNK_IN_MEMORY) { - prev = NULL; - iov = NULL; - - while (ch && (ch->hunk->type & NGX_HUNK_IN_MEMORY)) - { - if (prev == ch->hunk->pos.mem) { - iov->ngx_iov_len += ch->hunk->last.mem - ch->hunk->pos.mem; - - } else { - ngx_test_null(iov, ngx_push_array(header), - (ngx_chain_t *) -1); - iov->ngx_iov_base = ch->hunk->pos.mem; - iov->ngx_iov_len = ch->hunk->last.mem - ch->hunk->pos.mem; - prev = ch->hunk->last.mem; - } - - if (ch->hunk->type & NGX_HUNK_LAST) { - last = 1; - } - - ch = ch->next; - } - } - - if (ch && (ch->hunk->type & NGX_HUNK_FILE)) { - file = ch->hunk; - ch = ch->next; - - if (ch->hunk->type & NGX_HUNK_LAST) { - last = 1; - } - } - -#if (HAVE_MAX_SENDFILE_IOVEC) - if (file && header->nelts > HAVE_MAX_SENDFILE_IOVEC) { - rc = ngx_sendv(c->fd, (ngx_iovec_t *) header->elts, header->nelts, - &sent); - } else { -#endif - if (ch && ch->hunk->type & NGX_HUNK_IN_MEMORY) { - prev = NULL; - iov = NULL; - - while (ch && (ch->hunk->type & NGX_HUNK_IN_MEMORY)) { - - if (prev == ch->hunk->pos.mem) { - iov->ngx_iov_len += - ch->hunk->last.mem - ch->hunk->pos.mem; - - } else { - ngx_test_null(iov, ngx_push_array(trailer), - (ngx_chain_t *) -1); - iov->ngx_iov_base = ch->hunk->pos.mem; - iov->ngx_iov_len = - ch->hunk->last.mem - ch->hunk->pos.mem; - prev = ch->hunk->last.mem; - } - - if (ch->hunk->type & NGX_HUNK_LAST) { - last = 1; - } - - ch = ch->next; - } - } - - if (file) { - flags = ngx_sendfile_flags; -#if (HAVE_SENDFILE_DISCONNECT) - if (last && c->close) { - flags |= HAVE_SENDFILE_DISCONNECT; - } -#endif - rc = ngx_sendfile(c, - (ngx_iovec_t *) header->elts, header->nelts, - file->file->fd, file->pos.file, - (size_t) (file->last.file - file->pos.file), - (ngx_iovec_t *) trailer->elts, trailer->nelts, - &sent, flags); - -#if (HAVE_AIO_EVENT) && !(HAVE_IOCP_EVENT) - } else if (ngx_event_flags & NGX_HAVE_AIO_EVENT) { - - sent = 0; - rc = NGX_AGAIN; - iov = (ngx_iovec_t *) header->elts; - for (i = 0; i < header->nelts; i++) { - rc = ngx_event_aio_write(c, iov[i].ngx_iov_base, - iov[i].ngx_iov_len); - - if (rc > 0) { - sent += rc; - } else { - break; - } - - if (rc < (int) iov->ngx_iov_len) { - break; - } - } -#endif - } else { - rc = ngx_sendv(c, (ngx_iovec_t *) header->elts, header->nelts); - - sent = rc > 0 ? rc: 0; - -#if (NGX_DEBUG_EVENT_WRITE) - ngx_log_debug(c->log, "sendv: " OFF_FMT _ sent); -#endif - } -#if (HAVE_MAX_SENDFILE_IOVEC) - } -#endif - if (rc == NGX_ERROR) - return (ngx_chain_t *) NGX_ERROR; - - c->sent += sent; - flush -= sent; - - for (ch = in; ch; ch = ch->next) { - -#if (NGX_DEBUG_EVENT_WRITE) - ngx_log_debug(c->log, "event write: %x " QX_FMT " " OFF_FMT _ - ch->hunk->type _ - ch->hunk->pos.file _ - ch->hunk->last.file - ch->hunk->pos.file); -#endif - - if (sent >= ch->hunk->last.file - ch->hunk->pos.file) { - sent -= ch->hunk->last.file - ch->hunk->pos.file; - ch->hunk->pos.file = ch->hunk->last.file; - -#if (NGX_DEBUG_EVENT_WRITE) - ngx_log_debug(c->log, "event write: " QX_FMT " 0 " OFF_FMT _ - ch->hunk->pos.file _ sent); -#endif - -/* - if (ch->hunk->type & NGX_HUNK_LAST) - break; -*/ - - continue; - } - - ch->hunk->pos.file += sent; - -#if (NGX_DEBUG_EVENT_WRITE) - ngx_log_debug(c->log, "event write: " QX_FMT " " OFF_FMT _ - ch->hunk->pos.file _ - ch->hunk->last.file - ch->hunk->pos.file); -#endif - - break; - } - - /* flush hunks if threaded state */ - } while (c->write->context && flush > 0); - - ngx_destroy_array(trailer); - ngx_destroy_array(header); - - return ch; -} diff --git a/src/event/ngx_event_write.h b/src/event/ngx_event_write.h deleted file mode 100644 index a355866c8..000000000 --- a/src/event/ngx_event_write.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef _NGX_EVENT_WRITE_H_INCLUDED_ -#define _NGX_EVENT_WRITE_H_INCLUDED_ - - -#include <ngx_types.h> -#include <ngx_hunk.h> -#include <ngx_connection.h> - -ngx_chain_t *ngx_event_write(ngx_connection_t *cn, ngx_chain_t *in, - off_t flush); - - -#endif /* _NGX_EVENT_WRITE_H_INCLUDED_ */ diff --git a/src/event/ngx_event_wsarecv.c b/src/event/ngx_event_wsarecv.c index 20c0c1bd9..b97f97da4 100644 --- a/src/event/ngx_event_wsarecv.c +++ b/src/event/ngx_event_wsarecv.c @@ -32,7 +32,7 @@ ssize_t ngx_event_wsarecv(ngx_connection_t *c, char *buf, size_t size) if (ev->ready) { ev->ready = 0; -#if (HAVE_IOCP_EVENT) /* iocp */ +#if (HAVE_IOCP) /* iocp */ if (ngx_event_flags & NGX_HAVE_IOCP_EVENT) { if (ev->ovlp.error) { @@ -85,7 +85,7 @@ ssize_t ngx_event_wsarecv(ngx_connection_t *c, char *buf, size_t size) } } -#if (HAVE_IOCP_EVENT) /* iocp */ +#if (HAVE_IOCP) /* iocp */ if (ngx_event_flags & NGX_HAVE_IOCP_EVENT) { return NGX_AGAIN; |
