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