Mercurial > hg > nginx-vendor-current
comparison src/event/modules/ngx_kqueue_module.c @ 332:3a91bfeffaba NGINX_0_6_10
nginx 0.6.10
*) Feature: the "open_file_cache", "open_file_cache_retest", and
"open_file_cache_errors" directives.
*) Bugfix: socket leak; bug appeared in 0.6.7.
*) Bugfix: a charset set by the "charset" directive was not appended to
the "Content-Type" header set by $r->send_http_header().
*) Bugfix: a segmentation fault might occur in worker process if
/dev/poll method was used.
author | Igor Sysoev <http://sysoev.ru> |
---|---|
date | Mon, 03 Sep 2007 00:00:00 +0400 |
parents | f7cd062ee035 |
children | 820f6378fc00 |
comparison
equal
deleted
inserted
replaced
331:b69d5e83bf82 | 332:3a91bfeffaba |
---|---|
198 if (event_list == NULL) { | 198 if (event_list == NULL) { |
199 return NGX_ERROR; | 199 return NGX_ERROR; |
200 } | 200 } |
201 } | 201 } |
202 | 202 |
203 ngx_event_flags = 0; | 203 ngx_event_flags = NGX_USE_ONESHOT_EVENT |
204 |NGX_USE_KQUEUE_EVENT | |
205 |NGX_USE_VNODE_EVENT; | |
204 | 206 |
205 #if (NGX_HAVE_TIMER_EVENT) | 207 #if (NGX_HAVE_TIMER_EVENT) |
206 | 208 |
207 if (timer) { | 209 if (timer) { |
208 kev.ident = 0; | 210 kev.ident = 0; |
224 ngx_event_flags |= NGX_USE_TIMER_EVENT; | 226 ngx_event_flags |= NGX_USE_TIMER_EVENT; |
225 } | 227 } |
226 | 228 |
227 #endif | 229 #endif |
228 | 230 |
229 ngx_event_flags |= NGX_USE_ONESHOT_EVENT|NGX_USE_KQUEUE_EVENT; | |
230 | |
231 #if (NGX_HAVE_CLEAR_EVENT) | 231 #if (NGX_HAVE_CLEAR_EVENT) |
232 ngx_event_flags |= NGX_USE_CLEAR_EVENT; | 232 ngx_event_flags |= NGX_USE_CLEAR_EVENT; |
233 #else | 233 #else |
234 ngx_event_flags |= NGX_USE_LEVEL_EVENT; | 234 ngx_event_flags |= NGX_USE_LEVEL_EVENT; |
235 #endif | 235 #endif |
387 return NGX_OK; | 387 return NGX_OK; |
388 } | 388 } |
389 | 389 |
390 if (flags & NGX_DISABLE_EVENT) { | 390 if (flags & NGX_DISABLE_EVENT) { |
391 ev->disabled = 1; | 391 ev->disabled = 1; |
392 } | 392 |
393 | 393 } else { |
394 rc = ngx_kqueue_set_event(ev, event, | 394 flags |= EV_DELETE; |
395 flags & NGX_DISABLE_EVENT ? EV_DISABLE : EV_DELETE); | 395 } |
396 | |
397 rc = ngx_kqueue_set_event(ev, event, flags); | |
396 | 398 |
397 ngx_mutex_unlock(list_mutex); | 399 ngx_mutex_unlock(list_mutex); |
398 | 400 |
399 return rc; | 401 return rc; |
400 } | 402 } |
407 struct timespec ts; | 409 struct timespec ts; |
408 ngx_connection_t *c; | 410 ngx_connection_t *c; |
409 | 411 |
410 c = ev->data; | 412 c = ev->data; |
411 | 413 |
412 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, | 414 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, ev->log, 0, |
413 "kevent set event: %d: ft:%i fl:%04Xi", | 415 "kevent set event: %d: ft:%i fl:%04Xi", |
414 c->fd, filter, flags); | 416 c->fd, filter, flags); |
415 | 417 |
416 if (nchanges >= max_changes) { | 418 if (nchanges >= max_changes) { |
417 ngx_log_error(NGX_LOG_WARN, ev->log, 0, | 419 ngx_log_error(NGX_LOG_WARN, ev->log, 0, |
463 #endif | 465 #endif |
464 } | 466 } |
465 | 467 |
466 ev->index = nchanges; | 468 ev->index = nchanges; |
467 nchanges++; | 469 nchanges++; |
470 | |
471 if (flags & NGX_FLUSH_EVENT) { | |
472 ts.tv_sec = 0; | |
473 ts.tv_nsec = 0; | |
474 | |
475 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ev->log, 0, "kevent flush"); | |
476 | |
477 if (kevent(ngx_kqueue, change_list, (int) nchanges, NULL, 0, &ts) | |
478 == -1) | |
479 { | |
480 ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno, "kevent() failed"); | |
481 return NGX_ERROR; | |
482 } | |
483 | |
484 nchanges = 0; | |
485 } | |
468 | 486 |
469 return NGX_OK; | 487 return NGX_OK; |
470 } | 488 } |
471 | 489 |
472 | 490 |