diff options
Diffstat (limited to 'src/event/modules')
| -rw-r--r-- | src/event/modules/ngx_aio_module.c | 101 | ||||
| -rw-r--r-- | src/event/modules/ngx_devpoll_module.c | 2 | ||||
| -rw-r--r-- | src/event/modules/ngx_kqueue_module.c | 23 | ||||
| -rw-r--r-- | src/event/modules/ngx_kqueue_module.h | 2 |
4 files changed, 103 insertions, 25 deletions
diff --git a/src/event/modules/ngx_aio_module.c b/src/event/modules/ngx_aio_module.c index 20cb1a63c..24d049f80 100644 --- a/src/event/modules/ngx_aio_module.c +++ b/src/event/modules/ngx_aio_module.c @@ -1,39 +1,109 @@ #include <ngx_config.h> - #include <ngx_core.h> -#include <ngx_types.h> -#include <ngx_log.h> -#include <ngx_connection.h> #include <ngx_event.h> -#include <ngx_event_timer.h> +#include <ngx_aio.h> #if (HAVE_KQUEUE) #include <ngx_kqueue_module.h> #endif -int ngx_aio_init(int max_connections, ngx_log_t *log) -{ -#if (HAVE_KQUEUE) +static int ngx_aio_init(ngx_log_t *log); +static void ngx_aio_done(ngx_log_t *log); +static int ngx_aio_add_event(ngx_event_t *ev, int event, u_int flags); +static int ngx_aio_del_event(ngx_event_t *ev, int event, u_int flags); +static int ngx_aio_process_events(ngx_log_t *log); + + +ngx_os_io_t ngx_os_aio = { + ngx_aio_read, + NULL, + ngx_aio_write, + ngx_aio_write_chain, + NGX_HAVE_ZEROCOPY +}; + + +static ngx_str_t aio_name = ngx_string("aio"); + +ngx_event_module_t ngx_aio_module_ctx = { + NGX_EVENT_MODULE, + &aio_name, + NULL, /* create configuration */ + NULL, /* init configuration */ + + { + ngx_aio_add_event, /* add an event */ + ngx_aio_del_event, /* delete an event */ + NULL, /* enable an event */ + NULL, /* disable an event */ + NULL, /* add an connection */ + NULL, /* delete an connection */ + ngx_aio_process_events, /* process the events */ + ngx_aio_init, /* init the events */ + ngx_aio_done /* done the events */ + } + +}; - int rc; +ngx_module_t ngx_aio_module = { + &ngx_aio_module_ctx, /* module context */ + 0, /* module index */ + NULL, /* module directives */ + NGX_EVENT_MODULE_TYPE, /* module type */ + NULL /* init module */ +}; - rc = ngx_kqueue_init(max_connections, log); + + +#if (HAVE_KQUEUE) + +static int ngx_aio_init(ngx_log_t *log) +{ + if (ngx_kqueue_module_ctx.actions.init(log) == NGX_ERROR) { + return NGX_ERROR; + } ngx_event_flags = NGX_HAVE_AIO_EVENT|NGX_USE_AIO_EVENT; - ngx_write_chain_proc = ngx_aio_write_chain; + ngx_event_actions = ngx_aio_module_ctx.actions; + ngx_io = ngx_os_aio; - return rc; -#endif + return NGX_OK; } +static void ngx_aio_done(ngx_log_t *log) +{ + ngx_kqueue_module_ctx.actions.done(log); +} +/* The event adding and deleteing are needed for the listening sockets */ + +static int ngx_aio_add_event(ngx_event_t *ev, int event, u_int flags) +{ + return ngx_kqueue_module_ctx.actions.add(ev, event, flags); +} + + +static int ngx_aio_del_event(ngx_event_t *ev, int event, u_int flags) +{ + return ngx_kqueue_module_ctx.actions.del(ev, event, flags); +} + + +static int ngx_aio_process_events(ngx_log_t *log) +{ + return ngx_kqueue_module_ctx.actions.process(log); +} + +#endif + #if 0 + /* 1 */ int ngx_posix_aio_process_events(ngx_log_t *log) { @@ -66,6 +136,7 @@ int ngx_posix_aio_process_events(ngx_log_t *log) /* 3 */ int ngx_posix_aio_process_events(ngx_log_t *log) { +#if 0 unmask signal /* BUG: AIO signal can be delivered before select() */ @@ -73,6 +144,9 @@ int ngx_posix_aio_process_events(ngx_log_t *log) select(listen); mask signal +#endif + + pselect(listen, mask); if (ngx_socket_errno == NGX_EINTR) look ready array @@ -82,4 +156,5 @@ void aio_sig_handler(int signo, siginfo_t *siginfo, void *context) { push siginfo->si_value.sival_ptr } + #endif diff --git a/src/event/modules/ngx_devpoll_module.c b/src/event/modules/ngx_devpoll_module.c index 72efda4c4..531e96a24 100644 --- a/src/event/modules/ngx_devpoll_module.c +++ b/src/event/modules/ngx_devpoll_module.c @@ -10,7 +10,7 @@ #include <ngx_event.h> -#if (TEST_DEVPOLL) +#if (TEST_BUILD_DEVPOLL) /* Solaris declarations */ diff --git a/src/event/modules/ngx_kqueue_module.c b/src/event/modules/ngx_kqueue_module.c index 81475f70e..b8398b5f1 100644 --- a/src/event/modules/ngx_kqueue_module.c +++ b/src/event/modules/ngx_kqueue_module.c @@ -66,7 +66,7 @@ ngx_event_module_t ngx_kqueue_module_ctx = { NULL, /* delete an connection */ ngx_kqueue_process_events, /* process the events */ ngx_kqueue_init, /* init the events */ - ngx_kqueue_done, /* done the events */ + ngx_kqueue_done /* done the events */ } }; @@ -343,22 +343,23 @@ static int ngx_kqueue_process_events(ngx_log_t *log) } ev = (ngx_event_t *) event_list[i].udata; - instance = (uintptr_t) ev & 1; - ev = (void *) ((uintptr_t) ev & ~1); - - /* It's a stale event from a file descriptor - that was just closed in this iteration */ - - if (ev->active == 0 || ev->instance != instance) { - ngx_log_debug(log, "stale kevent"); - continue; - } switch (event_list[i].filter) { case EVFILT_READ: case EVFILT_WRITE: + instance = (uintptr_t) ev & 1; + ev = (void *) ((uintptr_t) ev & ~1); + + /* It's a stale event from a file descriptor + that was just closed in this iteration */ + + if (ev->active == 0 || ev->instance != instance) { + ngx_log_debug(log, "stale kevent"); + continue; + } + ev->available = event_list[i].data; if (event_list[i].flags & EV_EOF) { diff --git a/src/event/modules/ngx_kqueue_module.h b/src/event/modules/ngx_kqueue_module.h index 4f41ae790..72b85d235 100644 --- a/src/event/modules/ngx_kqueue_module.h +++ b/src/event/modules/ngx_kqueue_module.h @@ -9,6 +9,8 @@ typedef struct { extern int ngx_kqueue; +/* STUB */ extern ngx_event_module_t ngx_kqueue_module_ctx; + #endif /* _NGX_KQUEUE_MODULE_H_INCLUDED_ */ |
