aboutsummaryrefslogtreecommitdiff
path: root/src/event/modules/ngx_aio_module.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/event/modules/ngx_aio_module.c')
-rw-r--r--src/event/modules/ngx_aio_module.c101
1 files changed, 88 insertions, 13 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