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