Mercurial > hg > nginx
comparison src/event/modules/ngx_kqueue_module.c @ 105:00bee6e7b485
nginx-0.0.1-2003-06-15-22:32:13 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Sun, 15 Jun 2003 18:32:13 +0000 |
parents | 7e86d028d8f0 |
children | 1c002f2b77ed |
comparison
equal
deleted
inserted
replaced
104:7db96f59bc29 | 105:00bee6e7b485 |
---|---|
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 changes; | 14 u_int changes; |
15 int events; | 15 u_int events; |
16 } ngx_kqueue_conf_t; | 16 } ngx_kqueue_conf_t; |
17 | 17 |
18 | 18 |
19 static int ngx_kqueue_init(ngx_log_t *log); | 19 static int ngx_kqueue_init(ngx_log_t *log); |
20 static void ngx_kqueue_done(ngx_log_t *log); | 20 static void ngx_kqueue_done(ngx_log_t *log); |
25 | 25 |
26 static void *ngx_kqueue_create_conf(ngx_pool_t *pool); | 26 static void *ngx_kqueue_create_conf(ngx_pool_t *pool); |
27 static char *ngx_kqueue_init_conf(ngx_pool_t *pool, void *conf); | 27 static char *ngx_kqueue_init_conf(ngx_pool_t *pool, void *conf); |
28 | 28 |
29 | 29 |
30 int ngx_kqueue; | 30 int ngx_kqueue = -1; |
31 | 31 |
32 static struct kevent *change_list, *event_list; | 32 static struct kevent *change_list, *event_list; |
33 static u_int max_changes, nchanges; | 33 static u_int max_changes, nchanges, nevents; |
34 static int nevents; | |
35 | 34 |
36 | 35 |
37 static ngx_str_t kqueue_name = ngx_string("kqueue"); | 36 static ngx_str_t kqueue_name = ngx_string("kqueue"); |
38 | 37 |
39 static ngx_command_t ngx_kqueue_commands[] = { | 38 static ngx_command_t ngx_kqueue_commands[] = { |
84 }; | 83 }; |
85 | 84 |
86 | 85 |
87 static int ngx_kqueue_init(ngx_log_t *log) | 86 static int ngx_kqueue_init(ngx_log_t *log) |
88 { | 87 { |
88 struct timespec ts; | |
89 ngx_kqueue_conf_t *kcf; | 89 ngx_kqueue_conf_t *kcf; |
90 | 90 |
91 kcf = ngx_event_get_conf(ngx_kqueue_module); | 91 kcf = ngx_event_get_conf(ngx_kqueue_module); |
92 | 92 |
93 ngx_log_debug(log, "CH: %d" _ kcf->changes); | 93 ngx_log_debug(log, "CH: %d" _ kcf->changes); |
94 ngx_log_debug(log, "EV: %d" _ kcf->events); | 94 ngx_log_debug(log, "EV: %d" _ kcf->events); |
95 | 95 |
96 if (ngx_kqueue == -1) { | |
97 ngx_kqueue = kqueue(); | |
98 | |
99 if (ngx_kqueue == -1) { | |
100 ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "kqueue() failed"); | |
101 return NGX_ERROR; | |
102 } | |
103 } | |
104 | |
105 if (max_changes < kcf->changes) { | |
106 if (nchanges) { | |
107 ts.tv_sec = 0; | |
108 ts.tv_nsec = 0; | |
109 | |
110 if (kevent(ngx_kqueue, change_list, nchanges, NULL, 0, &ts) == -1) { | |
111 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "kevent() failed"); | |
112 return NGX_ERROR; | |
113 } | |
114 } | |
115 | |
116 if (change_list) { | |
117 ngx_free(change_list); | |
118 } | |
119 | |
120 ngx_test_null(change_list, | |
121 ngx_alloc(kcf->changes * sizeof(struct kevent), log), | |
122 NGX_ERROR); | |
123 } | |
124 | |
96 max_changes = kcf->changes; | 125 max_changes = kcf->changes; |
126 nchanges = 0; | |
127 | |
128 if (nevents < kcf->events) { | |
129 if (event_list) { | |
130 ngx_free(event_list); | |
131 } | |
132 | |
133 ngx_test_null(event_list, | |
134 ngx_alloc(kcf->events * sizeof(struct kevent), log), | |
135 NGX_ERROR); | |
136 } | |
137 | |
97 nevents = kcf->events; | 138 nevents = kcf->events; |
98 nchanges = 0; | |
99 | |
100 ngx_kqueue = kqueue(); | |
101 | |
102 if (ngx_kqueue == -1) { | |
103 ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "kqueue() failed"); | |
104 return NGX_ERROR; | |
105 } | |
106 | |
107 ngx_test_null(change_list, | |
108 ngx_alloc(kcf->changes * sizeof(struct kevent), log), | |
109 NGX_ERROR); | |
110 ngx_test_null(event_list, | |
111 ngx_alloc(kcf->events * sizeof(struct kevent), log), | |
112 NGX_ERROR); | |
113 | 139 |
114 if (ngx_event_timer_init(log) == NGX_ERROR) { | 140 if (ngx_event_timer_init(log) == NGX_ERROR) { |
115 return NGX_ERROR; | 141 return NGX_ERROR; |
116 } | 142 } |
143 | |
144 /* TODO: re-add active events with new udata | |
145 if ecf->connections was increased */ | |
117 | 146 |
118 ngx_event_actions = ngx_kqueue_module_ctx.actions; | 147 ngx_event_actions = ngx_kqueue_module_ctx.actions; |
119 | 148 |
120 ngx_event_flags = NGX_HAVE_LEVEL_EVENT | 149 ngx_event_flags = NGX_HAVE_LEVEL_EVENT |
121 |NGX_HAVE_ONESHOT_EVENT | 150 |NGX_HAVE_ONESHOT_EVENT |
137 { | 166 { |
138 if (close(ngx_kqueue) == -1) { | 167 if (close(ngx_kqueue) == -1) { |
139 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "kqueue close() failed"); | 168 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "kqueue close() failed"); |
140 } | 169 } |
141 | 170 |
171 ngx_kqueue = -1; | |
172 | |
142 ngx_event_timer_done(log); | 173 ngx_event_timer_done(log); |
143 | 174 |
144 ngx_free(change_list); | 175 ngx_free(change_list); |
145 ngx_free(event_list); | 176 ngx_free(event_list); |
177 | |
178 change_list = NULL; | |
179 event_list = NULL; | |
180 max_changes = 0; | |
181 nchanges = 0; | |
182 nevents = 0; | |
146 } | 183 } |
147 | 184 |
148 | 185 |
149 static int ngx_kqueue_add_event(ngx_event_t *ev, int event, u_int flags) | 186 static int ngx_kqueue_add_event(ngx_event_t *ev, int event, u_int flags) |
150 { | 187 { |
207 } | 244 } |
208 | 245 |
209 | 246 |
210 static int ngx_kqueue_set_event(ngx_event_t *ev, int filter, u_int flags) | 247 static int ngx_kqueue_set_event(ngx_event_t *ev, int filter, u_int flags) |
211 { | 248 { |
212 struct timespec ts; | 249 struct timespec ts; |
213 ngx_connection_t *c; | 250 ngx_connection_t *c; |
214 | 251 |
215 c = ev->data; | 252 c = ev->data; |
216 | 253 |
217 #if (NGX_DEBUG_EVENT) | 254 #if (NGX_DEBUG_EVENT) |
218 ngx_log_debug(ev->log, "kqueue set event: %d: ft:%d fl:%08x" _ | 255 ngx_log_debug(ev->log, "kqueue set event: %d: ft:%d fl:%08x" _ |
225 | 262 |
226 ts.tv_sec = 0; | 263 ts.tv_sec = 0; |
227 ts.tv_nsec = 0; | 264 ts.tv_nsec = 0; |
228 | 265 |
229 if (kevent(ngx_kqueue, change_list, nchanges, NULL, 0, &ts) == -1) { | 266 if (kevent(ngx_kqueue, change_list, nchanges, NULL, 0, &ts) == -1) { |
230 ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno, "kevent failed"); | 267 ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno, "kevent() failed"); |
231 return NGX_ERROR; | 268 return NGX_ERROR; |
232 } | 269 } |
233 | 270 |
234 nchanges = 0; | 271 nchanges = 0; |
235 } | 272 } |
293 #endif | 330 #endif |
294 | 331 |
295 events = kevent(ngx_kqueue, change_list, nchanges, event_list, nevents, tp); | 332 events = kevent(ngx_kqueue, change_list, nchanges, event_list, nevents, tp); |
296 | 333 |
297 if (events == -1) { | 334 if (events == -1) { |
298 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "kevent failed"); | 335 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "kevent() failed"); |
299 return NGX_ERROR; | 336 return NGX_ERROR; |
300 } | 337 } |
301 | 338 |
302 nchanges = 0; | 339 nchanges = 0; |
303 | 340 |
311 ngx_event_expire_timers(delta); | 348 ngx_event_expire_timers(delta); |
312 | 349 |
313 } else { | 350 } else { |
314 if (events == 0) { | 351 if (events == 0) { |
315 ngx_log_error(NGX_LOG_ALERT, log, 0, | 352 ngx_log_error(NGX_LOG_ALERT, log, 0, |
316 "kevent returns no events without timeout"); | 353 "kevent() returned no events without timeout"); |
317 return NGX_ERROR; | 354 return NGX_ERROR; |
318 } | 355 } |
319 } | 356 } |
320 | 357 |
321 #if (NGX_DEBUG_EVENT) | 358 #if (NGX_DEBUG_EVENT) |
340 } | 377 } |
341 #endif | 378 #endif |
342 | 379 |
343 if (event_list[i].flags & EV_ERROR) { | 380 if (event_list[i].flags & EV_ERROR) { |
344 ngx_log_error(NGX_LOG_ALERT, log, event_list[i].data, | 381 ngx_log_error(NGX_LOG_ALERT, log, event_list[i].data, |
345 "kevent error on %d", event_list[i].ident); | 382 "kevent() error on %d", event_list[i].ident); |
346 continue; | 383 continue; |
347 } | 384 } |
348 | 385 |
349 ev = (ngx_event_t *) event_list[i].udata; | 386 ev = (ngx_event_t *) event_list[i].udata; |
350 | 387 |
412 | 449 |
413 static char *ngx_kqueue_init_conf(ngx_pool_t *pool, void *conf) | 450 static char *ngx_kqueue_init_conf(ngx_pool_t *pool, void *conf) |
414 { | 451 { |
415 ngx_kqueue_conf_t *kcf = conf; | 452 ngx_kqueue_conf_t *kcf = conf; |
416 | 453 |
417 ngx_conf_init_value(kcf->changes, 512); | 454 ngx_conf_init_unsigned_value(kcf->changes, 512); |
418 ngx_conf_init_value(kcf->events, 512); | 455 ngx_conf_init_unsigned_value(kcf->events, 512); |
419 | 456 |
420 return NGX_CONF_OK; | 457 return NGX_CONF_OK; |
421 } | 458 } |