Mercurial > hg > nginx-quic
comparison src/event/modules/ngx_kqueue_module.c @ 306:6b91bfbc4123
nginx-0.0.3-2004-04-05-00:32:09 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Sun, 04 Apr 2004 20:32:09 +0000 |
parents | 4b1a3a4acc60 |
children | ce375c313e96 |
comparison
equal
deleted
inserted
replaced
305:4b1a3a4acc60 | 306:6b91bfbc4123 |
---|---|
20 static void ngx_kqueue_done(ngx_cycle_t *cycle); | 20 static void ngx_kqueue_done(ngx_cycle_t *cycle); |
21 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); |
22 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); |
23 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); |
24 static int ngx_kqueue_process_events(ngx_cycle_t *cycle); | 24 static int ngx_kqueue_process_events(ngx_cycle_t *cycle); |
25 #if (NGX_THREADS) | |
26 static void ngx_kqueue_thread_handler(ngx_event_t *ev); | |
27 #endif | |
28 | 25 |
29 static void *ngx_kqueue_create_conf(ngx_cycle_t *cycle); | 26 static void *ngx_kqueue_create_conf(ngx_cycle_t *cycle); |
30 static char *ngx_kqueue_init_conf(ngx_cycle_t *cycle, void *conf); | 27 static char *ngx_kqueue_init_conf(ngx_cycle_t *cycle, void *conf); |
31 | 28 |
32 | 29 |
69 ngx_kqueue_add_event, /* enable an event */ | 66 ngx_kqueue_add_event, /* enable an event */ |
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 #if (NGX_THREADS0) | |
75 ngx_kqueue_thread_handler, /* process an event by thread */ | |
76 #endif | |
77 ngx_kqueue_init, /* init the events */ | 71 ngx_kqueue_init, /* init the events */ |
78 ngx_kqueue_done /* done the events */ | 72 ngx_kqueue_done /* done the events */ |
79 } | 73 } |
80 | 74 |
81 }; | 75 }; |
159 |NGX_USE_LEVEL_EVENT | 153 |NGX_USE_LEVEL_EVENT |
160 #endif | 154 #endif |
161 #if (HAVE_LOWAT_EVENT) | 155 #if (HAVE_LOWAT_EVENT) |
162 |NGX_HAVE_LOWAT_EVENT | 156 |NGX_HAVE_LOWAT_EVENT |
163 #endif | 157 #endif |
158 |NGX_HAVE_INSTANCE_EVENT | |
164 |NGX_HAVE_KQUEUE_EVENT; | 159 |NGX_HAVE_KQUEUE_EVENT; |
165 | 160 |
166 return NGX_OK; | 161 return NGX_OK; |
167 } | 162 } |
168 | 163 |
344 | 339 |
345 | 340 |
346 static ngx_int_t ngx_kqueue_process_events(ngx_cycle_t *cycle) | 341 static ngx_int_t ngx_kqueue_process_events(ngx_cycle_t *cycle) |
347 { | 342 { |
348 int events; | 343 int events; |
349 ngx_int_t i; | 344 ngx_int_t i, instance; |
350 ngx_uint_t instance; | 345 ngx_uint_t lock, expire; |
351 ngx_err_t err; | 346 ngx_err_t err; |
352 ngx_msec_t timer; | 347 ngx_msec_t timer; |
353 ngx_event_t *ev; | 348 ngx_event_t *ev; |
354 ngx_epoch_msec_t delta; | 349 ngx_epoch_msec_t delta; |
355 struct timeval tv; | 350 struct timeval tv; |
362 return NGX_ERROR; | 357 return NGX_ERROR; |
363 } | 358 } |
364 | 359 |
365 /* | 360 /* |
366 * TODO: if timer is 0 and any worker thread is still busy | 361 * TODO: if timer is 0 and any worker thread is still busy |
367 * then set 1 second timeout | 362 * then set 500 ms timeout |
368 */ | 363 */ |
369 | 364 |
370 #endif | 365 #endif |
371 | 366 |
372 ngx_old_elapsed_msec = ngx_elapsed_msec; | 367 ngx_old_elapsed_msec = ngx_elapsed_msec; |
368 expire = 1; | |
373 | 369 |
374 if (ngx_accept_mutex) { | 370 if (ngx_accept_mutex) { |
375 if (ngx_trylock_accept_mutex(cycle) == NGX_ERROR) { | 371 if (ngx_trylock_accept_mutex(cycle) == NGX_ERROR) { |
376 return NGX_ERROR; | 372 return NGX_ERROR; |
377 } | 373 } |
378 | 374 |
379 #if 1 | 375 if (ngx_accept_mutex_held == 0 |
380 if (ngx_accept_mutex_held == 0 && timer == 0) { | 376 && (timer == 0 || timer > ngx_accept_mutex_delay)) |
381 /* STUB */ timer = 500; | 377 { |
382 } | 378 timer = ngx_accept_mutex_delay; |
383 #endif | 379 expire = 0; |
380 } | |
384 } | 381 } |
385 | 382 |
386 if (timer) { | 383 if (timer) { |
387 ts.tv_sec = timer / 1000; | 384 ts.tv_sec = timer / 1000; |
388 ts.tv_nsec = (timer % 1000) * 1000000; | 385 ts.tv_nsec = (timer % 1000) * 1000000; |
389 tp = &ts; | 386 tp = &ts; |
390 | 387 |
391 } else { | 388 } else { |
392 tp = NULL; | 389 tp = NULL; |
390 expire = 0; | |
393 } | 391 } |
394 | 392 |
395 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, | 393 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, |
396 "kevent timer: %d", timer); | 394 "kevent timer: %d", timer); |
397 | 395 |
439 if (ngx_mutex_lock(ngx_posted_events_mutex) == NGX_ERROR) { | 437 if (ngx_mutex_lock(ngx_posted_events_mutex) == NGX_ERROR) { |
440 ngx_accept_mutex_unlock(); | 438 ngx_accept_mutex_unlock(); |
441 return NGX_ERROR; | 439 return NGX_ERROR; |
442 } | 440 } |
443 | 441 |
442 lock = 1; | |
443 | |
444 for (i = 0; i < events; i++) { | 444 for (i = 0; i < events; i++) { |
445 | 445 |
446 ngx_log_debug6(NGX_LOG_DEBUG_EVENT, cycle->log, 0, | 446 ngx_log_debug6(NGX_LOG_DEBUG_EVENT, cycle->log, 0, |
447 | 447 |
448 (event_list[i].ident > 0x8000000 | 448 (event_list[i].ident > 0x8000000 |
515 "unexpected kevent() filter %d", | 515 "unexpected kevent() filter %d", |
516 event_list[i].filter); | 516 event_list[i].filter); |
517 continue; | 517 continue; |
518 } | 518 } |
519 | 519 |
520 | 520 if (!ngx_threaded && !ngx_accept_mutex_held) { |
521 if (ngx_threaded || ngx_accept_mutex_held) { | 521 ev->event_handler(ev); |
522 | |
523 if (ev->accept) { | |
524 ngx_mutex_unlock(ngx_posted_events_mutex); | |
525 | |
526 ev->event_handler(ev); | |
527 | |
528 if (ngx_mutex_lock(ngx_posted_events_mutex) == NGX_ERROR) { | |
529 ngx_accept_mutex_unlock(); | |
530 return NGX_ERROR; | |
531 } | |
532 | |
533 } else { | |
534 ev->next = (ngx_event_t *) ngx_posted_events; | |
535 ngx_posted_events = ev; | |
536 } | |
537 | |
538 continue; | 522 continue; |
539 } | 523 } |
540 | 524 |
525 if (!ev->accept) { | |
526 ngx_post_event(ev); | |
527 continue; | |
528 } | |
529 | |
530 ngx_mutex_unlock(ngx_posted_events_mutex); | |
531 | |
541 ev->event_handler(ev); | 532 ev->event_handler(ev); |
542 } | 533 |
543 | 534 if (i + 1 == events) { |
544 ngx_mutex_unlock(ngx_posted_events_mutex); | 535 lock = 0; |
536 break; | |
537 } | |
538 | |
539 if (ngx_mutex_lock(ngx_posted_events_mutex) == NGX_ERROR) { | |
540 ngx_accept_mutex_unlock(); | |
541 return NGX_ERROR; | |
542 } | |
543 } | |
544 | |
545 if (lock) { | |
546 ngx_mutex_unlock(ngx_posted_events_mutex); | |
547 } | |
545 | 548 |
546 ngx_accept_mutex_unlock(); | 549 ngx_accept_mutex_unlock(); |
547 | 550 |
548 if (timer && delta) { | 551 if (expire && delta) { |
549 ngx_event_expire_timers((ngx_msec_t) delta); | 552 ngx_event_expire_timers((ngx_msec_t) delta); |
550 } | 553 } |
551 | 554 |
552 if (ngx_threaded) { | 555 if (!ngx_threaded) { |
553 return NGX_OK; | 556 ngx_event_process_posted(cycle); |
554 } | |
555 | |
556 for ( ;; ) { | |
557 | |
558 ev = (ngx_event_t *) ngx_posted_events; | |
559 | |
560 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, | |
561 "kevent: posted event " PTR_FMT, ev); | |
562 | |
563 if (ev == NULL) { | |
564 break; | |
565 } | |
566 | |
567 ngx_posted_events = ev->next; | |
568 | |
569 if ((!ev->posted && !ev->active) | |
570 || ev->instance != ev->returned_instance) | |
571 { | |
572 /* | |
573 * the stale event from a file descriptor | |
574 * that was just closed in this iteration | |
575 */ | |
576 | |
577 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, | |
578 "kevent: stale event " PTR_FMT, ev); | |
579 continue; | |
580 } | |
581 | |
582 if (ev->posted) { | |
583 ev->posted = 0; | |
584 } | |
585 | |
586 ev->event_handler(ev); | |
587 } | 557 } |
588 | 558 |
589 return NGX_OK; | 559 return NGX_OK; |
590 } | 560 } |
591 | |
592 | |
593 #if (NGX_THREADS) | |
594 | |
595 static void ngx_kqueue_thread_handler(ngx_event_t *ev) | |
596 { | |
597 if ((!ev->posted && !ev->active) | |
598 || ev->instance != ev->returned_instance) | |
599 { | |
600 /* | |
601 * the stale event from a file descriptor | |
602 * that was just closed in this iteration | |
603 */ | |
604 | |
605 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ev->log, 0, | |
606 "kevent: stale event " PTR_FMT, ev); | |
607 return; | |
608 } | |
609 | |
610 if (ev->posted) { | |
611 ev->posted = 0; | |
612 } | |
613 | |
614 ev->event_handler(ev); | |
615 } | |
616 | |
617 #endif | |
618 | 561 |
619 | 562 |
620 static void *ngx_kqueue_create_conf(ngx_cycle_t *cycle) | 563 static void *ngx_kqueue_create_conf(ngx_cycle_t *cycle) |
621 { | 564 { |
622 ngx_kqueue_conf_t *kcf; | 565 ngx_kqueue_conf_t *kcf; |