diff options
| author | Igor Sysoev <igor@sysoev.ru> | 2003-02-06 17:21:13 +0000 |
|---|---|---|
| committer | Igor Sysoev <igor@sysoev.ru> | 2003-02-06 17:21:13 +0000 |
| commit | 7300977320e04280c13d4d89a279f75af9c5f893 (patch) | |
| tree | 6c935b625eb2dbd83e71e5b2e23ac83bfd88aded /src/event/modules | |
| parent | 2a2d2b5094ee88dba5984eddfc4135b66bb8007e (diff) | |
| download | nginx-7300977320e04280c13d4d89a279f75af9c5f893.tar.gz nginx-7300977320e04280c13d4d89a279f75af9c5f893.tar.bz2 | |
nginx-0.0.1-2003-02-06-20:21:13 import
Diffstat (limited to 'src/event/modules')
| -rw-r--r-- | src/event/modules/ngx_devpoll_module.c | 8 | ||||
| -rw-r--r-- | src/event/modules/ngx_iocp_module.c | 137 | ||||
| -rw-r--r-- | src/event/modules/ngx_iocp_module.h | 15 | ||||
| -rw-r--r-- | src/event/modules/ngx_kqueue_module.c | 35 | ||||
| -rw-r--r-- | src/event/modules/ngx_kqueue_module.h | 6 | ||||
| -rw-r--r-- | src/event/modules/ngx_poll_module.c | 9 | ||||
| -rw-r--r-- | src/event/modules/ngx_select_module.c | 6 |
7 files changed, 199 insertions, 17 deletions
diff --git a/src/event/modules/ngx_devpoll_module.c b/src/event/modules/ngx_devpoll_module.c index 13971ad4d..e2e7750f1 100644 --- a/src/event/modules/ngx_devpoll_module.c +++ b/src/event/modules/ngx_devpoll_module.c @@ -16,6 +16,7 @@ #error "/dev/poll is not supported on this platform" #endif +static int ngx_devpoll_set_event(ngx_event_t *ev, int event, u_int flags); /* STUB */ #define DEVPOLL_NCHANGES 512 @@ -137,7 +138,7 @@ int ngx_devpoll_del_event(ngx_event_t *ev, int event, u_int flags) } -int ngx_devpoll_set_event(ngx_event_t *ev, int event, u_int flags) +static int ngx_devpoll_set_event(ngx_event_t *ev, int event, u_int flags) { int n; ngx_connection_t *c; @@ -192,7 +193,6 @@ int ngx_devpoll_process_events(ngx_log_t *log) int events, n, i; ngx_msec_t timer, delta; ngx_err_t err; - ngx_event_t *ev; ngx_connection_t *c; struct dvpoll dvp; struct timeval tv; @@ -233,7 +233,7 @@ int ngx_devpoll_process_events(ngx_log_t *log) nchanges = 0; - if (timer != INFTIM) { + if ((int) timer != INFTIM) { gettimeofday(&tv, NULL); delta = tv.tv_sec * 1000 + tv.tv_usec / 1000 - delta; @@ -305,7 +305,7 @@ int ngx_devpoll_process_events(ngx_log_t *log) } } - if (timer != INFTIM) { + if ((int) timer != INFTIM) { ngx_event_expire_timers(delta); } diff --git a/src/event/modules/ngx_iocp_module.c b/src/event/modules/ngx_iocp_module.c new file mode 100644 index 000000000..f474c4c61 --- /dev/null +++ b/src/event/modules/ngx_iocp_module.c @@ -0,0 +1,137 @@ + +#include <ngx_config.h> + +#include <ngx_core.h> +#include <ngx_log.h> +#include <ngx_errno.h> +#include <ngx_time.h> +#include <ngx_connection.h> +#include <ngx_event.h> +#include <ngx_event_timer.h> + +#include <ngx_iocp_module.h> + + +int ngx_iocp_threads = 0;; + + +static HANDLE iocp; +static ngx_event_t *timer_queue; + + +int ngx_iocp_init(int max_connections, ngx_log_t *log) +{ + iocp = CreateIoCompletionPort(INVALID_HANDLE_VALUE, + NULL, 0, ngx_iocp_threads); + + if (iocp == NULL) { + ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, + "CreateIoCompletionPort() failed"); + return NGX_ERROR; + } + + timer_queue = ngx_event_init_timer(log); + if (timer_queue == NULL) { + return NGX_ERROR; + } + + ngx_event_actions.process = ngx_iocp_process_events; + + ngx_event_flags = NGX_HAVE_AIO_EVENT|NGX_HAVE_IOCP_EVENT; + + return NGX_OK; +} + + +int ngx_iocp_add_event(ngx_event_t *ev) +{ + ngx_connection_t *c; + + c = (ngx_connection_t *) ev->data; + + ngx_log_debug(ev->log, "iocp: %d, %08x:%08x" _ c->fd _ ev _ &ev->ovlp); + + if (CreateIoCompletionPort((HANDLE) c->fd, iocp, (DWORD) ev, 0) == NULL) { + ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno, + "CreateIoCompletionPort() failed"); + return NGX_ERROR; + } + + return NGX_OK; +} + + +int ngx_iocp_process_events(ngx_log_t *log) +{ + int rc; + size_t bytes; + ngx_err_t err; + ngx_msec_t timer, delta; + ngx_event_t *ev, *e; + ngx_event_ovlp_t *ovlp; + + ngx_log_debug(log, "iocp"); + + timer = ngx_event_find_timer(); + + if (timer) { + delta = ngx_msec(); + + } else { + timer = INFINITE; + delta = 0; + } + + ngx_log_debug(log, "iocp timer: %d" _ timer); + +#if 1 + rc = GetQueuedCompletionStatus(iocp, &bytes, (LPDWORD) &e, + (LPOVERLAPPED *) &ovlp, timer); + ngx_log_debug(log, "iocp: %d, %d:%08x:%08x" _ rc _ bytes _ e _ ovlp); + if (rc == 0) { +#else + if (GetQueuedCompletionStatus(iocp, &bytes, (LPDWORD) &e, + (LPOVERLAPPED *) &ovlp, timer) == 0) { +#endif + err = ngx_errno; + + if (ovlp == NULL) { + if (err != WAIT_TIMEOUT) { + ngx_log_error(NGX_LOG_ALERT, log, err, + "GetQueuedCompletionStatus() failed"); + + return NGX_ERROR; + } + + } else { + ovlp->error = err; + } + } + + if (timer != INFINITE) { + delta = ngx_msec() - delta; + } + + if (ovlp) { + ev = ovlp->event; + +ngx_log_debug(log, "iocp ev: %08x" _ ev); + + if (ev == e) { + ev->ready = 1; + ev->available = bytes; + } + +ngx_log_debug(log, "iocp ev: %08x" _ ev->event_handler); + + if (ev->event_handler(ev) == NGX_ERROR) { + ev->close_handler(ev); + } + } + + if (timer != INFINITE) { + ngx_event_expire_timers(delta); + } + + return NGX_OK; +} diff --git a/src/event/modules/ngx_iocp_module.h b/src/event/modules/ngx_iocp_module.h new file mode 100644 index 000000000..d7f2f5192 --- /dev/null +++ b/src/event/modules/ngx_iocp_module.h @@ -0,0 +1,15 @@ +#ifndef _NGX_IOCP_MODULE_H_INCLUDED_ +#define _NGX_IOCP_MODULE_H_INCLUDED_ + + +#include <ngx_types.h> +#include <ngx_log.h> +#include <ngx_event.h> + + +int ngx_iocp_init(int max_connections, ngx_log_t *log); +int ngx_iocp_add_event(ngx_event_t *ev); +int ngx_iocp_process_events(ngx_log_t *log); + + +#endif /* _NGX_IOCP_MODULE_H_INCLUDED_ */ diff --git a/src/event/modules/ngx_kqueue_module.c b/src/event/modules/ngx_kqueue_module.c index abf3b6e61..da8450e62 100644 --- a/src/event/modules/ngx_kqueue_module.c +++ b/src/event/modules/ngx_kqueue_module.c @@ -23,7 +23,11 @@ /* should be per-thread */ +#if 1 +int kq; +#else static int kq; +#endif static struct kevent *change_list, *event_list; static unsigned int nchanges; static int nevents; @@ -63,7 +67,12 @@ int ngx_kqueue_init(int max_connections, ngx_log_t *log) ngx_event_actions.process = ngx_kqueue_process_events; ngx_event_flags = NGX_HAVE_LEVEL_EVENT - |NGX_HAVE_ONESHOT_EVENT|NGX_HAVE_CLEAR_EVENT; + |NGX_HAVE_ONESHOT_EVENT +#if (HAVE_AIO_EVENT) + |NGX_HAVE_AIO_EVENT; +#else + |NGX_HAVE_CLEAR_EVENT; +#endif #endif return NGX_OK; @@ -221,10 +230,19 @@ int ngx_kqueue_process_events(ngx_log_t *log) for (i = 0; i < events; i++) { #if (NGX_DEBUG_EVENT) - ngx_log_debug(log, "kevent: %d: ft:%d f:%08x ff:%08x d:%d ud:%08x" _ - event_list[i].ident _ event_list[i].filter _ - event_list[i].flags _ event_list[i].fflags _ - event_list[i].data _ event_list[i].udata); + if (event_list[i].ident > 0x8000000) { + ngx_log_debug(log, + "kevent: %08x: ft:%d f:%08x ff:%08x d:%d ud:%08x" _ + event_list[i].ident _ event_list[i].filter _ + event_list[i].flags _ event_list[i].fflags _ + event_list[i].data _ event_list[i].udata); + } else { + ngx_log_debug(log, + "kevent: %d: ft:%d f:%08x ff:%08x d:%d ud:%08x" _ + event_list[i].ident _ event_list[i].filter _ + event_list[i].flags _ event_list[i].fflags _ + event_list[i].data _ event_list[i].udata); + } #endif if (event_list[i].flags & EV_ERROR) { @@ -243,7 +261,6 @@ int ngx_kqueue_process_events(ngx_log_t *log) case EVFILT_READ: case EVFILT_WRITE: - ev->ready = 1; ev->available = event_list[i].data; if (event_list[i].flags & EV_EOF) { @@ -255,12 +272,18 @@ int ngx_kqueue_process_events(ngx_log_t *log) ngx_del_timer(ev); } + /* fall through */ + + case EVFILT_AIO: + ev->ready = 1; + if (ev->event_handler(ev) == NGX_ERROR) { ev->close_handler(ev); } break; + default: ngx_log_error(NGX_LOG_ALERT, log, 0, "unknown kevent filter %d" _ event_list[i].filter); diff --git a/src/event/modules/ngx_kqueue_module.h b/src/event/modules/ngx_kqueue_module.h index c56192018..568476ed0 100644 --- a/src/event/modules/ngx_kqueue_module.h +++ b/src/event/modules/ngx_kqueue_module.h @@ -14,4 +14,10 @@ void ngx_kqueue_add_timer(ngx_event_t *ev, ngx_msec_t timer); int ngx_kqueue_process_events(ngx_log_t *log); +#if 1 +extern int kq; +#endif + + + #endif /* _NGX_KQUEUE_MODULE_H_INCLUDED_ */ diff --git a/src/event/modules/ngx_poll_module.c b/src/event/modules/ngx_poll_module.c index e27031cfc..939340e46 100644 --- a/src/event/modules/ngx_poll_module.c +++ b/src/event/modules/ngx_poll_module.c @@ -13,7 +13,7 @@ /* should be per-thread */ static struct pollfd *event_list; -static unsigned int nevents; +static u_int nevents; static ngx_event_t **event_index; static ngx_event_t **ready_index; @@ -140,7 +140,8 @@ int ngx_poll_del_event(ngx_event_t *ev, int event, u_int flags) int ngx_poll_process_events(ngx_log_t *log) { - int i, ready, nready, found; + int ready, found; + u_int i, nready; ngx_msec_t timer, delta; ngx_err_t err; ngx_event_t *ev; @@ -172,7 +173,7 @@ int ngx_poll_process_events(ngx_log_t *log) ngx_log_debug(log, "poll ready %d" _ ready); - if (timer != INFTIM) { + if ((int) timer != INFTIM) { delta = ngx_msec() - delta; } else { @@ -256,7 +257,7 @@ int ngx_poll_process_events(ngx_log_t *log) ngx_log_error(NGX_LOG_ALERT, log, 0, "poll ready != events"); } - if (timer != INFTIM) { + if ((int) timer != INFTIM) { ngx_event_expire_timers(delta); } diff --git a/src/event/modules/ngx_select_module.c b/src/event/modules/ngx_select_module.c index fe461c3f5..50d030c74 100644 --- a/src/event/modules/ngx_select_module.c +++ b/src/event/modules/ngx_select_module.c @@ -23,7 +23,7 @@ static int max_write; static int max_fd; #endif -static int nevents; +static u_int nevents; static ngx_event_t **event_index; static ngx_event_t **ready_index; @@ -177,8 +177,8 @@ int ngx_select_del_event(ngx_event_t *ev, int event, u_int flags) int ngx_select_process_events(ngx_log_t *log) { - int ready, found, nready; - u_int i; + int ready, found; + u_int i, nready; ngx_msec_t timer, delta; ngx_event_t *ev; ngx_connection_t *c; |
