Mercurial > hg > nginx
comparison src/event/modules/ngx_kqueue_module.c @ 218:05592fd7a436
nginx-0.0.1-2004-01-05-23:55:48 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Mon, 05 Jan 2004 20:55:48 +0000 |
parents | f536f91e8e99 |
children | 1119faf4635a |
comparison
equal
deleted
inserted
replaced
217:c5d1cdcb04ec | 218:05592fd7a436 |
---|---|
90 struct timespec ts; | 90 struct timespec ts; |
91 ngx_kqueue_conf_t *kcf; | 91 ngx_kqueue_conf_t *kcf; |
92 | 92 |
93 kcf = ngx_event_get_conf(cycle->conf_ctx, ngx_kqueue_module); | 93 kcf = ngx_event_get_conf(cycle->conf_ctx, ngx_kqueue_module); |
94 | 94 |
95 ngx_log_debug(cycle->log, "CH: %d" _ kcf->changes); | |
96 ngx_log_debug(cycle->log, "EV: %d" _ kcf->events); | |
97 | |
98 if (ngx_kqueue == -1) { | 95 if (ngx_kqueue == -1) { |
99 ngx_kqueue = kqueue(); | 96 ngx_kqueue = kqueue(); |
100 | 97 |
101 if (ngx_kqueue == -1) { | 98 if (ngx_kqueue == -1) { |
102 ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, | 99 ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, |
194 { | 191 { |
195 ngx_event_t *e; | 192 ngx_event_t *e; |
196 ngx_connection_t *c; | 193 ngx_connection_t *c; |
197 | 194 |
198 ev->active = 1; | 195 ev->active = 1; |
196 ev->disabled = 0; | |
199 ev->oneshot = (flags & NGX_ONESHOT_EVENT) ? 1 : 0; | 197 ev->oneshot = (flags & NGX_ONESHOT_EVENT) ? 1 : 0; |
200 | 198 |
201 if (nchanges > 0 | 199 if (nchanges > 0 |
202 && ev->index < (u_int) nchanges | 200 && ev->index < (u_int) nchanges |
203 && ((uintptr_t) change_list[ev->index].udata & (uintptr_t) ~1) | 201 && ((uintptr_t) change_list[ev->index].udata & (uintptr_t) ~1) |
204 == (uintptr_t) ev) | 202 == (uintptr_t) ev) |
205 { | 203 { |
206 if (change_list[ev->index].flags == EV_DISABLE) { | 204 if (change_list[ev->index].flags == EV_DISABLE) { |
207 | 205 |
208 #if (NGX_DEBUG_EVENT) | 206 /* |
209 ngx_connection_t *c = (ngx_connection_t *) ev->data; | 207 * if the EV_DISABLE is still not passed to a kernel |
210 ngx_log_debug(ev->log, "kqueue event activated: %d: ft:%d" _ | 208 * we will not pass it |
211 c->fd _ event); | 209 */ |
212 #endif | 210 |
213 | 211 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0, |
214 /* | 212 "kevent activated: %d: ft:%d", |
215 * if the EV_DISABLE is still not passed to a kernel | 213 ngx_event_ident(ev->data), event); |
216 * we will not pass it | |
217 */ | |
218 | 214 |
219 if (ev->index < (u_int) --nchanges) { | 215 if (ev->index < (u_int) --nchanges) { |
220 e = (ngx_event_t *) change_list[nchanges].udata; | 216 e = (ngx_event_t *) change_list[nchanges].udata; |
221 change_list[ev->index] = change_list[nchanges]; | 217 change_list[ev->index] = change_list[nchanges]; |
222 e->index = ev->index; | 218 e->index = ev->index; |
239 static int ngx_kqueue_del_event(ngx_event_t *ev, int event, u_int flags) | 235 static int ngx_kqueue_del_event(ngx_event_t *ev, int event, u_int flags) |
240 { | 236 { |
241 ngx_event_t *e; | 237 ngx_event_t *e; |
242 | 238 |
243 ev->active = 0; | 239 ev->active = 0; |
240 ev->disabled = 0; | |
244 | 241 |
245 if (nchanges > 0 | 242 if (nchanges > 0 |
246 && ev->index < (u_int) nchanges | 243 && ev->index < (u_int) nchanges |
247 && ((uintptr_t) change_list[ev->index].udata & (uintptr_t) ~1) | 244 && ((uintptr_t) change_list[ev->index].udata & (uintptr_t) ~1) |
248 == (uintptr_t) ev) | 245 == (uintptr_t) ev) |
249 { | 246 { |
250 #if (NGX_DEBUG_EVENT) | 247 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0, |
251 ngx_connection_t *c = (ngx_connection_t *) ev->data; | 248 "kevent deleted: %d: ft:%d", |
252 ngx_log_debug(ev->log, "kqueue event deleted: %d: ft:%d" _ | 249 ngx_event_ident(ev->data), event); |
253 c->fd _ event); | |
254 #endif | |
255 | 250 |
256 /* if the event is still not passed to a kernel we will not pass it */ | 251 /* if the event is still not passed to a kernel we will not pass it */ |
257 | 252 |
258 if (ev->index < (u_int) --nchanges) { | 253 if (ev->index < (u_int) --nchanges) { |
259 e = (ngx_event_t *) change_list[nchanges].udata; | 254 e = (ngx_event_t *) change_list[nchanges].udata; |
270 * before the closing the file descriptor. | 265 * before the closing the file descriptor. |
271 */ | 266 */ |
272 | 267 |
273 if (flags & NGX_CLOSE_EVENT) { | 268 if (flags & NGX_CLOSE_EVENT) { |
274 return NGX_OK; | 269 return NGX_OK; |
270 } | |
271 | |
272 if (flags & NGX_DISABLE_EVENT) { | |
273 ev->disabled = 1; | |
275 } | 274 } |
276 | 275 |
277 return ngx_kqueue_set_event(ev, event, | 276 return ngx_kqueue_set_event(ev, event, |
278 flags & NGX_DISABLE_EVENT ? EV_DISABLE : EV_DELETE); | 277 flags & NGX_DISABLE_EVENT ? EV_DISABLE : EV_DELETE); |
279 } | 278 } |
344 } | 343 } |
345 | 344 |
346 | 345 |
347 static int ngx_kqueue_process_events(ngx_log_t *log) | 346 static int ngx_kqueue_process_events(ngx_log_t *log) |
348 { | 347 { |
349 int events, instance, i; | 348 ngx_int_t events, instance, i; |
350 ngx_err_t err; | 349 ngx_err_t err; |
351 ngx_msec_t timer; | 350 ngx_msec_t timer; |
352 ngx_event_t *ev; | 351 ngx_event_t *ev; |
353 ngx_epoch_msec_t delta; | 352 ngx_epoch_msec_t delta; |
354 struct timeval tv; | 353 struct timeval tv; |
389 #if 1 | 388 #if 1 |
390 delta = ngx_elapsed_msec; | 389 delta = ngx_elapsed_msec; |
391 #endif | 390 #endif |
392 ngx_elapsed_msec = tv.tv_sec * 1000 + tv.tv_usec / 1000 - ngx_start_msec; | 391 ngx_elapsed_msec = tv.tv_sec * 1000 + tv.tv_usec / 1000 - ngx_start_msec; |
393 | 392 |
394 if (ngx_cached_time != tv.tv_sec) { | 393 ngx_time_update(tv.tv_sec); |
395 ngx_cached_time = tv.tv_sec; | |
396 ngx_time_update(); | |
397 } | |
398 | 394 |
399 if (timer) { | 395 if (timer) { |
400 delta = ngx_elapsed_msec - delta; | 396 delta = ngx_elapsed_msec - delta; |
401 | 397 |
402 } else { | 398 } else { |
405 "kevent() returned no events without timeout"); | 401 "kevent() returned no events without timeout"); |
406 return NGX_ERROR; | 402 return NGX_ERROR; |
407 } | 403 } |
408 } | 404 } |
409 | 405 |
410 #if (NGX_DEBUG_EVENT) | 406 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, log, 0, |
411 ngx_log_debug(log, "kevent timer: %d, delta: %d" _ timer _ (int) delta); | 407 "kevent timer: %d, delta: %d", timer, (int) delta); |
412 #endif | |
413 | 408 |
414 if (err) { | 409 if (err) { |
415 ngx_log_error(NGX_LOG_ALERT, log, err, "kevent() failed"); | 410 ngx_log_error((err == NGX_EINTR) ? NGX_LOG_INFO : NGX_LOG_ALERT, |
411 log, err, "kevent() failed"); | |
416 return NGX_ERROR; | 412 return NGX_ERROR; |
417 } | 413 } |
418 | 414 |
419 for (i = 0; i < events; i++) { | 415 for (i = 0; i < events; i++) { |
420 | 416 |