Mercurial > hg > nginx-quic
comparison src/event/modules/ngx_kqueue_module.c @ 113:d7f606e25b99
nginx-0.0.1-2003-07-04-19:10:33 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Fri, 04 Jul 2003 15:10:33 +0000 |
parents | da763a85be66 |
children | ac69ab96328d |
comparison
equal
deleted
inserted
replaced
112:da763a85be66 | 113:d7f606e25b99 |
---|---|
9 #include <ngx_event.h> | 9 #include <ngx_event.h> |
10 #include <ngx_kqueue_module.h> | 10 #include <ngx_kqueue_module.h> |
11 | 11 |
12 | 12 |
13 typedef struct { | 13 typedef struct { |
14 int kqueue; | |
15 struct kevent *change_list; | |
16 u_int changes; | 14 u_int changes; |
17 struct kevent *event_list; | |
18 u_int events; | 15 u_int events; |
19 } ngx_kqueue_conf_t; | 16 } ngx_kqueue_conf_t; |
20 | 17 |
21 | 18 |
22 static int ngx_kqueue_init(ngx_log_t *log); | 19 static int ngx_kqueue_init(ngx_cycle_t *cycle); |
23 static void ngx_kqueue_done(ngx_log_t *log); | 20 static void ngx_kqueue_done(ngx_cycle_t *cycle); |
24 static int ngx_kqueue_add_event(ngx_event_t *ev, int event, u_int flags); | 21 static int ngx_kqueue_add_event(ngx_event_t *ev, int event, u_int flags); |
25 static int ngx_kqueue_del_event(ngx_event_t *ev, int event, u_int flags); | 22 static int ngx_kqueue_del_event(ngx_event_t *ev, int event, u_int flags); |
26 static int ngx_kqueue_set_event(ngx_event_t *ev, int filter, u_int flags); | 23 static int ngx_kqueue_set_event(ngx_event_t *ev, int filter, u_int flags); |
27 static int ngx_kqueue_process_events(ngx_log_t *log); | 24 static int ngx_kqueue_process_events(ngx_log_t *log); |
28 | 25 |
70 ngx_kqueue_del_event, /* disable an event */ | 67 ngx_kqueue_del_event, /* disable an event */ |
71 NULL, /* add an connection */ | 68 NULL, /* add an connection */ |
72 NULL, /* delete an connection */ | 69 NULL, /* delete an connection */ |
73 ngx_kqueue_process_events, /* process the events */ | 70 ngx_kqueue_process_events, /* process the events */ |
74 ngx_kqueue_init, /* init the events */ | 71 ngx_kqueue_init, /* init the events */ |
75 #if 0 | |
76 ngx_kqueue_commit, /* commit the events */ | |
77 ngx_kqueue_rollback, /* rollback the events */ | |
78 #endif | |
79 ngx_kqueue_done /* done the events */ | 72 ngx_kqueue_done /* done the events */ |
80 } | 73 } |
81 | 74 |
82 }; | 75 }; |
83 | 76 |
85 NGX_MODULE, | 78 NGX_MODULE, |
86 &ngx_kqueue_module_ctx, /* module context */ | 79 &ngx_kqueue_module_ctx, /* module context */ |
87 ngx_kqueue_commands, /* module directives */ | 80 ngx_kqueue_commands, /* module directives */ |
88 NGX_EVENT_MODULE, /* module type */ | 81 NGX_EVENT_MODULE, /* module type */ |
89 NULL, /* init module */ | 82 NULL, /* init module */ |
90 NULL, /* commit module */ | |
91 NULL, /* rollback module */ | |
92 #if 0 | |
93 NULL /* init child */ | 83 NULL /* init child */ |
94 #endif | |
95 }; | 84 }; |
96 | 85 |
97 | 86 |
98 #if 0 | 87 |
99 | 88 static int ngx_kqueue_init(ngx_cycle_t *cycle) |
100 static int ngx_kqueue_init(ngx_cycle_t *cycle, ngx_log_t *log) | |
101 { | 89 { |
102 struct timespec ts; | 90 struct timespec ts; |
103 ngx_kqueue_conf_t *kcf; | 91 ngx_kqueue_conf_t *kcf; |
104 | 92 |
105 kcf = ngx_event_get_conf(cycle->conf_ctx, ngx_kqueue_module); | 93 kcf = ngx_event_get_conf(cycle->conf_ctx, ngx_kqueue_module); |
106 | 94 |
107 ngx_log_debug(log, "CH: %d" _ kcf->changes); | 95 ngx_log_debug(cycle->log, "CH: %d" _ kcf->changes); |
108 ngx_log_debug(log, "EV: %d" _ kcf->events); | 96 ngx_log_debug(cycle->log, "EV: %d" _ kcf->events); |
109 | 97 |
110 if (ngx_kqueue == -1) { | 98 if (ngx_kqueue == -1) { |
111 kcf->kqueue = kqueue(); | 99 ngx_kqueue = kqueue(); |
112 | 100 |
113 if (kcf->kqueue == -1) { | 101 if (ngx_kqueue == -1) { |
114 ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "kqueue() failed"); | 102 ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, |
103 "kqueue() failed"); | |
115 return NGX_ERROR; | 104 return NGX_ERROR; |
116 } | 105 } |
117 | |
118 } else { | |
119 kcf->kqueue = ngx_kqueue; | |
120 } | 106 } |
121 | 107 |
122 if (max_changes < kcf->changes) { | 108 if (max_changes < kcf->changes) { |
123 if (nchanges) { | 109 if (nchanges) { |
124 ts.tv_sec = 0; | 110 ts.tv_sec = 0; |
125 ts.tv_nsec = 0; | 111 ts.tv_nsec = 0; |
126 | 112 |
127 if (kevent(ngx_kqueue, change_list, nchanges, NULL, 0, &ts) == -1) { | 113 if (kevent(ngx_kqueue, change_list, nchanges, NULL, 0, &ts) == -1) { |
128 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "kevent() failed"); | 114 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, |
115 "kevent() failed"); | |
129 return NGX_ERROR; | 116 return NGX_ERROR; |
130 } | 117 } |
131 | |
132 nchanges = 0; | 118 nchanges = 0; |
133 } | 119 } |
134 | 120 |
135 ngx_test_null(kcf->change_list, | 121 if (change_list) { |
136 ngx_alloc(kcf->changes * sizeof(struct kevent), log), | 122 ngx_free(change_list); |
123 } | |
124 | |
125 ngx_test_null(change_list, | |
126 ngx_alloc(kcf->changes * sizeof(struct kevent), | |
127 cycle->log), | |
137 NGX_ERROR); | 128 NGX_ERROR); |
138 | 129 } |
139 } else { | 130 |
140 kcf->change_list = change_list; | 131 max_changes = kcf->changes; |
141 } | |
142 | 132 |
143 if (nevents < kcf->events) { | 133 if (nevents < kcf->events) { |
144 ngx_test_null(kcf->event_list, | 134 if (event_list) { |
145 ngx_alloc(kcf->events * sizeof(struct kevent), log), | 135 ngx_free(event_list); |
136 } | |
137 | |
138 ngx_test_null(event_list, | |
139 ngx_alloc(kcf->events * sizeof(struct kevent), | |
140 cycle->log), | |
146 NGX_ERROR); | 141 NGX_ERROR); |
147 } else { | 142 } |
148 kcf->event_list = event_list; | 143 |
149 } | 144 nevents = kcf->events; |
150 | 145 |
151 if (ngx_event_timer_init(cycle, log) == NGX_ERROR) { | 146 if (ngx_event_timer_init(cycle) == NGX_ERROR) { |
152 return NGX_ERROR; | 147 return NGX_ERROR; |
153 } | 148 } |
154 | 149 |
155 return NGX_OK; | 150 ngx_io = ngx_os_io; |
156 } | |
157 | |
158 | |
159 static void ngx_kqueue_commit(ngx_cycle_t *cycle, ngx_log_t *log) | |
160 { | |
161 ngx_kqueue_conf_t *kcf; | |
162 | |
163 kcf = ngx_event_get_conf(cycle->conf_ctx, ngx_kqueue_module); | |
164 | |
165 ngx_kqueue = kcf->kqueue; | |
166 | |
167 if (change_list != kcf->change_list) { | |
168 ngx_free(change_list); | |
169 change_list = kcf->change_list; | |
170 } | |
171 | |
172 max_changes = kcf->changes; | |
173 | |
174 if (event_list != kcf->event_list) { | |
175 ngx_free(event_list); | |
176 event_list = kcf->event_list; | |
177 } | |
178 | |
179 nevents = kcf->events; | |
180 | |
181 ngx_event_timer_commit(cycle, log); | |
182 | 151 |
183 ngx_event_actions = ngx_kqueue_module_ctx.actions; | 152 ngx_event_actions = ngx_kqueue_module_ctx.actions; |
184 ngx_io = ngx_os_io; | |
185 | 153 |
186 ngx_event_flags = NGX_HAVE_LEVEL_EVENT | 154 ngx_event_flags = NGX_HAVE_LEVEL_EVENT |
187 |NGX_HAVE_ONESHOT_EVENT | 155 |NGX_HAVE_ONESHOT_EVENT |
188 #if (HAVE_CLEAR_EVENT) | 156 #if (HAVE_CLEAR_EVENT) |
189 |NGX_HAVE_CLEAR_EVENT | 157 |NGX_HAVE_CLEAR_EVENT |
192 #endif | 160 #endif |
193 #if (HAVE_LOWAT_EVENT) | 161 #if (HAVE_LOWAT_EVENT) |
194 |NGX_HAVE_LOWAT_EVENT | 162 |NGX_HAVE_LOWAT_EVENT |
195 #endif | 163 #endif |
196 |NGX_HAVE_KQUEUE_EVENT; | 164 |NGX_HAVE_KQUEUE_EVENT; |
197 } | |
198 | |
199 | |
200 static void ngx_kqueue_rollback(ngx_cycle_t *cycle, ngx_log_t *log) | |
201 { | |
202 ngx_kqueue_conf_t *kcf; | |
203 | |
204 kcf = ngx_event_get_conf(cycle->conf_ctx, ngx_kqueue_module); | |
205 | |
206 if (ngx_kqueue == -1) { | |
207 if (close(kcf->kqueue) == -1) { | |
208 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, | |
209 "kqueue close() failed"); | |
210 } | |
211 } | |
212 | |
213 if (change_list != kcf->change_list) { | |
214 ngx_free(kcf->change_list); | |
215 } | |
216 | |
217 if (event_list != kcf->event_list) { | |
218 ngx_free(kcf->event_list); | |
219 } | |
220 | |
221 ngx_event_timer_rollback(cycle, log); | |
222 } | |
223 | |
224 #endif | |
225 | |
226 | |
227 static int ngx_kqueue_init(ngx_log_t *log) | |
228 { | |
229 struct timespec ts; | |
230 ngx_kqueue_conf_t *kcf; | |
231 | |
232 kcf = ngx_event_get_conf(ngx_kqueue_module); | |
233 | |
234 ngx_log_debug(log, "CH: %d" _ kcf->changes); | |
235 ngx_log_debug(log, "EV: %d" _ kcf->events); | |
236 | |
237 if (ngx_kqueue == -1) { | |
238 ngx_kqueue = kqueue(); | |
239 | |
240 if (ngx_kqueue == -1) { | |
241 ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "kqueue() failed"); | |
242 return NGX_ERROR; | |
243 } | |
244 } | |
245 | |
246 if (max_changes < kcf->changes) { | |
247 if (nchanges) { | |
248 ts.tv_sec = 0; | |
249 ts.tv_nsec = 0; | |
250 | |
251 if (kevent(ngx_kqueue, change_list, nchanges, NULL, 0, &ts) == -1) { | |
252 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "kevent() failed"); | |
253 return NGX_ERROR; | |
254 } | |
255 } | |
256 | |
257 if (change_list) { | |
258 ngx_free(change_list); | |
259 } | |
260 | |
261 ngx_test_null(change_list, | |
262 ngx_alloc(kcf->changes * sizeof(struct kevent), log), | |
263 NGX_ERROR); | |
264 } | |
265 | |
266 max_changes = kcf->changes; | |
267 nchanges = 0; | |
268 | |
269 if (nevents < kcf->events) { | |
270 if (event_list) { | |
271 ngx_free(event_list); | |
272 } | |
273 | |
274 ngx_test_null(event_list, | |
275 ngx_alloc(kcf->events * sizeof(struct kevent), log), | |
276 NGX_ERROR); | |
277 } | |
278 | |
279 nevents = kcf->events; | |
280 | |
281 if (ngx_event_timer_init(log) == NGX_ERROR) { | |
282 return NGX_ERROR; | |
283 } | |
284 | |
285 /* TODO: re-add active events with new udata | |
286 if ecf->connections was increased */ | |
287 | |
288 ngx_event_actions = ngx_kqueue_module_ctx.actions; | |
289 | |
290 ngx_event_flags = NGX_HAVE_LEVEL_EVENT | |
291 |NGX_HAVE_ONESHOT_EVENT | |
292 #if (HAVE_CLEAR_EVENT) | |
293 |NGX_HAVE_CLEAR_EVENT | |
294 #else | |
295 |NGX_USE_LEVEL_EVENT | |
296 #endif | |
297 #if (HAVE_LOWAT_EVENT) | |
298 |NGX_HAVE_LOWAT_EVENT | |
299 #endif | |
300 |NGX_HAVE_KQUEUE_EVENT; | |
301 | 165 |
302 return NGX_OK; | 166 return NGX_OK; |
303 } | 167 } |
304 | 168 |
305 | 169 |
306 static void ngx_kqueue_done(ngx_log_t *log) | 170 static void ngx_kqueue_done(ngx_cycle_t *cycle) |
307 { | 171 { |
308 if (close(ngx_kqueue) == -1) { | 172 if (close(ngx_kqueue) == -1) { |
309 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "kqueue close() failed"); | 173 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, |
174 "kqueue close() failed"); | |
310 } | 175 } |
311 | 176 |
312 ngx_kqueue = -1; | 177 ngx_kqueue = -1; |
313 | 178 |
314 ngx_event_timer_done(log); | 179 ngx_event_timer_done(cycle); |
315 | 180 |
316 ngx_free(change_list); | 181 ngx_free(change_list); |
317 ngx_free(event_list); | 182 ngx_free(event_list); |
318 | 183 |
319 change_list = NULL; | 184 change_list = NULL; |