Annotation of embedaddon/nginx/src/event/modules/ngx_aio_module.c, revision 1.1.1.1
1.1 misho 1:
2: /*
3: * Copyright (C) Igor Sysoev
4: * Copyright (C) Nginx, Inc.
5: */
6:
7:
8: #include <ngx_config.h>
9: #include <ngx_core.h>
10: #include <ngx_event.h>
11:
12:
13: extern ngx_event_module_t ngx_kqueue_module_ctx;
14:
15:
16: static ngx_int_t ngx_aio_init(ngx_cycle_t *cycle, ngx_msec_t timer);
17: static void ngx_aio_done(ngx_cycle_t *cycle);
18: static ngx_int_t ngx_aio_add_event(ngx_event_t *ev, ngx_int_t event,
19: ngx_uint_t flags);
20: static ngx_int_t ngx_aio_del_event(ngx_event_t *ev, ngx_int_t event,
21: ngx_uint_t flags);
22: static ngx_int_t ngx_aio_del_connection(ngx_connection_t *c, ngx_uint_t flags);
23: static ngx_int_t ngx_aio_process_events(ngx_cycle_t *cycle, ngx_msec_t timer,
24: ngx_uint_t flags);
25:
26:
27: ngx_os_io_t ngx_os_aio = {
28: ngx_aio_read,
29: ngx_aio_read_chain,
30: NULL,
31: ngx_aio_write,
32: ngx_aio_write_chain,
33: 0
34: };
35:
36:
37: static ngx_str_t aio_name = ngx_string("aio");
38:
39: ngx_event_module_t ngx_aio_module_ctx = {
40: &aio_name,
41: NULL, /* create configuration */
42: NULL, /* init configuration */
43:
44: {
45: ngx_aio_add_event, /* add an event */
46: ngx_aio_del_event, /* delete an event */
47: NULL, /* enable an event */
48: NULL, /* disable an event */
49: NULL, /* add an connection */
50: ngx_aio_del_connection, /* delete an connection */
51: NULL, /* process the changes */
52: ngx_aio_process_events, /* process the events */
53: ngx_aio_init, /* init the events */
54: ngx_aio_done /* done the events */
55: }
56:
57: };
58:
59: ngx_module_t ngx_aio_module = {
60: NGX_MODULE_V1,
61: &ngx_aio_module_ctx, /* module context */
62: NULL, /* module directives */
63: NGX_EVENT_MODULE, /* module type */
64: NULL, /* init master */
65: NULL, /* init module */
66: NULL, /* init process */
67: NULL, /* init thread */
68: NULL, /* exit thread */
69: NULL, /* exit process */
70: NULL, /* exit master */
71: NGX_MODULE_V1_PADDING
72: };
73:
74:
75: #if (NGX_HAVE_KQUEUE)
76:
77: static ngx_int_t
78: ngx_aio_init(ngx_cycle_t *cycle, ngx_msec_t timer)
79: {
80: if (ngx_kqueue_module_ctx.actions.init(cycle, timer) == NGX_ERROR) {
81: return NGX_ERROR;
82: }
83:
84: ngx_io = ngx_os_aio;
85:
86: ngx_event_flags = NGX_USE_AIO_EVENT;
87: ngx_event_actions = ngx_aio_module_ctx.actions;
88:
89:
90: return NGX_OK;
91: }
92:
93:
94: static void
95: ngx_aio_done(ngx_cycle_t *cycle)
96: {
97: ngx_kqueue_module_ctx.actions.done(cycle);
98: }
99:
100:
101: /* the event adding and deleting are needed for the listening sockets */
102:
103: static ngx_int_t
104: ngx_aio_add_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags)
105: {
106: return ngx_kqueue_module_ctx.actions.add(ev, event, flags);
107: }
108:
109:
110: static ngx_int_t
111: ngx_aio_del_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags)
112: {
113: return ngx_kqueue_module_ctx.actions.del(ev, event, flags);
114: }
115:
116:
117: static ngx_int_t
118: ngx_aio_del_connection(ngx_connection_t *c, ngx_uint_t flags)
119: {
120: int rc;
121:
122: if (c->read->active == 0 && c->write->active == 0) {
123: return NGX_OK;
124: }
125:
126: if (flags & NGX_CLOSE_EVENT) {
127: return NGX_OK;
128: }
129:
130: rc = aio_cancel(c->fd, NULL);
131:
132: ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "aio_cancel: %d", rc);
133:
134: if (rc == AIO_CANCELED) {
135: c->read->active = 0;
136: c->write->active = 0;
137: return NGX_OK;
138: }
139:
140: if (rc == AIO_ALLDONE) {
141: c->read->active = 0;
142: c->write->active = 0;
143: ngx_log_error(NGX_LOG_ALERT, c->log, 0,
144: "aio_cancel() returned AIO_ALLDONE");
145: return NGX_OK;
146: }
147:
148: if (rc == -1) {
149: ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno,
150: "aio_cancel() failed");
151: return NGX_ERROR;
152: }
153:
154: if (rc == AIO_NOTCANCELED) {
155: ngx_log_error(NGX_LOG_ALERT, c->log, 0,
156: "aio_cancel() returned AIO_NOTCANCELED");
157:
158: return NGX_ERROR;
159: }
160:
161: return NGX_OK;
162: }
163:
164:
165: static ngx_int_t
166: ngx_aio_process_events(ngx_cycle_t *cycle, ngx_msec_t timer, ngx_uint_t flags)
167: {
168: return ngx_kqueue_module_ctx.actions.process_events(cycle, timer, flags);
169: }
170:
171: #endif /* NGX_HAVE_KQUEUE */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>