comparison src/event/modules/ngx_kqueue_module.c @ 301:744965ec6275

nginx-0.0.3-2004-03-31-19:26:46 import
author Igor Sysoev <igor@sysoev.ru>
date Wed, 31 Mar 2004 15:26:46 +0000
parents d4e65d74db9f
children 1526e7686b20
comparison
equal deleted inserted replaced
300:502b03d9d2a3 301:744965ec6275
19 static int ngx_kqueue_init(ngx_cycle_t *cycle); 19 static int ngx_kqueue_init(ngx_cycle_t *cycle);
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_log_t *log); 24 static int ngx_kqueue_process_events(ngx_cycle_t *cycle);
25 #if (NGX_THREADS) 25 #if (NGX_THREADS)
26 static void ngx_kqueue_thread_handler(ngx_event_t *ev); 26 static void ngx_kqueue_thread_handler(ngx_event_t *ev);
27 #endif 27 #endif
28 28
29 static void *ngx_kqueue_create_conf(ngx_cycle_t *cycle); 29 static void *ngx_kqueue_create_conf(ngx_cycle_t *cycle);
341 341
342 return NGX_OK; 342 return NGX_OK;
343 } 343 }
344 344
345 345
346 static ngx_int_t ngx_kqueue_process_events(ngx_log_t *log) 346 static ngx_int_t ngx_kqueue_process_events(ngx_cycle_t *cycle)
347 { 347 {
348 int events; 348 int events;
349 ngx_int_t instance, i; 349 ngx_int_t i, instance;
350 ngx_err_t err; 350 ngx_err_t err;
351 ngx_msec_t timer; 351 ngx_msec_t timer;
352 ngx_event_t *ev; 352 ngx_event_t *ev;
353 ngx_epoch_msec_t delta; 353 ngx_epoch_msec_t delta;
354 struct timeval tv; 354 struct timeval tv;
368 368
369 #endif 369 #endif
370 370
371 ngx_old_elapsed_msec = ngx_elapsed_msec; 371 ngx_old_elapsed_msec = ngx_elapsed_msec;
372 372
373 if (ngx_accept_mutex) {
374 if (ngx_trylock_accept_mutex(cycle) == NGX_ERROR) {
375 return NGX_ERROR;
376 }
377
378 #if 1
379 if (ngx_accept_token == 0 && timer == 0) {
380 /* STUB */ timer = 500;
381 }
382 #endif
383 }
384
373 if (timer) { 385 if (timer) {
374 ts.tv_sec = timer / 1000; 386 ts.tv_sec = timer / 1000;
375 ts.tv_nsec = (timer % 1000) * 1000000; 387 ts.tv_nsec = (timer % 1000) * 1000000;
376 tp = &ts; 388 tp = &ts;
377 389
378 } else { 390 } else {
379 tp = NULL; 391 tp = NULL;
380 } 392 }
381 393
382 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0, "kevent timer: %d", timer); 394 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
395 "kevent timer: %d", timer);
383 396
384 events = kevent(ngx_kqueue, change_list, nchanges, event_list, nevents, tp); 397 events = kevent(ngx_kqueue, change_list, nchanges, event_list, nevents, tp);
385 398
386 if (events == -1) { 399 if (events == -1) {
387 err = ngx_errno; 400 err = ngx_errno;
392 nchanges = 0; 405 nchanges = 0;
393 406
394 ngx_gettimeofday(&tv); 407 ngx_gettimeofday(&tv);
395 ngx_time_update(tv.tv_sec); 408 ngx_time_update(tv.tv_sec);
396 409
397 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0, "kevent events: %d", events); 410 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
411 "kevent events: %d", events);
398 412
399 delta = ngx_elapsed_msec; 413 delta = ngx_elapsed_msec;
400 ngx_elapsed_msec = tv.tv_sec * 1000 + tv.tv_usec / 1000 - ngx_start_msec; 414 ngx_elapsed_msec = tv.tv_sec * 1000 + tv.tv_usec / 1000 - ngx_start_msec;
401 415
402 if (err) { 416 if (err) {
403 ngx_log_error((err == NGX_EINTR) ? NGX_LOG_INFO : NGX_LOG_ALERT, 417 ngx_log_error((err == NGX_EINTR) ? NGX_LOG_INFO : NGX_LOG_ALERT,
404 log, err, "kevent() failed"); 418 cycle->log, err, "kevent() failed");
419
420 if (ngx_accept_token) {
421 *ngx_accept_mutex = 0;
422 }
423
405 return NGX_ERROR; 424 return NGX_ERROR;
406 } 425 }
407 426
408 if (timer) { 427 if (timer) {
409 delta = ngx_elapsed_msec - delta; 428 delta = ngx_elapsed_msec - delta;
410 429
411 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, log, 0, 430 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
412 "kevent timer: %d, delta: %d", timer, (int) delta); 431 "kevent timer: %d, delta: %d", timer, (int) delta);
413 432
414 } else { 433 } else {
415 if (events == 0) { 434 if (events == 0) {
416 ngx_log_error(NGX_LOG_ALERT, log, 0, 435 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
417 "kevent() returned no events without timeout"); 436 "kevent() returned no events without timeout");
437
438 if (ngx_accept_token) {
439 *ngx_accept_mutex = 0;
440 }
441
418 return NGX_ERROR; 442 return NGX_ERROR;
419 } 443 }
420 } 444 }
421 445
422 #if (NGX_THREADS0)
423 if (ngx_mutex_lock(ngx_posted_events_mutex) == NGX_ERROR) { 446 if (ngx_mutex_lock(ngx_posted_events_mutex) == NGX_ERROR) {
447
448 if (ngx_accept_token) {
449 *ngx_accept_mutex = 0;
450 }
451
424 return NGX_ERROR; 452 return NGX_ERROR;
425 } 453 }
426 #endif
427 454
428 for (i = 0; i < events; i++) { 455 for (i = 0; i < events; i++) {
429 456
430 ngx_log_debug6(NGX_LOG_DEBUG_EVENT, log, 0, 457 ngx_log_debug6(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
431 458
432 (event_list[i].ident > 0x8000000 459 (event_list[i].ident > 0x8000000
433 && event_list[i].ident != (unsigned) -1) ? 460 && event_list[i].ident != (unsigned) -1) ?
434 "kevent: " PTR_FMT ": ft:%d fl:%04X ff:%08X d:%d ud:" 461 "kevent: " PTR_FMT ": ft:%d fl:%04X ff:%08X d:%d ud:"
435 PTR_FMT: 462 PTR_FMT:
438 event_list[i].ident, event_list[i].filter, 465 event_list[i].ident, event_list[i].filter,
439 event_list[i].flags, event_list[i].fflags, 466 event_list[i].flags, event_list[i].fflags,
440 event_list[i].data, event_list[i].udata); 467 event_list[i].data, event_list[i].udata);
441 468
442 if (event_list[i].flags & EV_ERROR) { 469 if (event_list[i].flags & EV_ERROR) {
443 ngx_log_error(NGX_LOG_ALERT, log, event_list[i].data, 470 ngx_log_error(NGX_LOG_ALERT, cycle->log, event_list[i].data,
444 "kevent() error on %d", event_list[i].ident); 471 "kevent() error on %d", event_list[i].ident);
445 continue; 472 continue;
446 } 473 }
447 474
448 ev = (ngx_event_t *) event_list[i].udata; 475 ev = (ngx_event_t *) event_list[i].udata;
452 case EVFILT_READ: 479 case EVFILT_READ:
453 case EVFILT_WRITE: 480 case EVFILT_WRITE:
454 481
455 instance = (uintptr_t) ev & 1; 482 instance = (uintptr_t) ev & 1;
456 ev = (ngx_event_t *) ((uintptr_t) ev & (uintptr_t) ~1); 483 ev = (ngx_event_t *) ((uintptr_t) ev & (uintptr_t) ~1);
457 484 ev->returned_instance = instance;
458 if (ev->active == 0 || ev->instance != instance) { 485
486 if (!ev->active || ev->instance != instance) {
459 487
460 /* 488 /*
461 * the stale event from a file descriptor 489 * the stale event from a file descriptor
462 * that was just closed in this iteration 490 * that was just closed in this iteration
463 */ 491 */
464 492
465 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0, 493 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
466 "kevent: stale event " PTR_FMT, ev); 494 "kevent: stale event " PTR_FMT, ev);
467 continue; 495 continue;
468 } 496 }
469 497
470 ev->available = event_list[i].data; 498 ev->available = event_list[i].data;
492 ev->ready = 1; 520 ev->ready = 1;
493 521
494 break; 522 break;
495 523
496 default: 524 default:
497 ngx_log_error(NGX_LOG_ALERT, log, 0, 525 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
498 "unexpected kevent() filter %d", 526 "unexpected kevent() filter %d",
499 event_list[i].filter); 527 event_list[i].filter);
500 continue; 528 continue;
501 } 529 }
502 530
503 #if (NGX_THREADS0) 531
504 532 #if 0
505 if (ngx_threaded) { 533 if (ngx_threaded || ngx_accept_token) {
506 534 #endif
507 if (ev->light) { 535 if (ngx_accept_token) {
508 536
509 /* 537 if (ev->accept) {
510 * The light events are the accept event,
511 * or the event that waits in the mutex queue - we need to
512 * remove it from the mutex queue before the inserting into
513 * the posted events queue.
514 */
515
516 ngx_mutex_unlock(ngx_posted_events_mutex); 538 ngx_mutex_unlock(ngx_posted_events_mutex);
517 539
518 ev->event_handler(ev); 540 ev->event_handler(ev);
519 541
520 if (ngx_mutex_lock(ngx_posted_events_mutex) == NGX_ERROR) { 542 if (ngx_mutex_lock(ngx_posted_events_mutex) == NGX_ERROR) {
543
544 if (ngx_accept_token) {
545 *ngx_accept_mutex = 0;
546 }
547
521 return NGX_ERROR; 548 return NGX_ERROR;
522 } 549 }
523 550
524 } else { 551 } else {
525 ev->next = ngx_posted_events; 552 ev->next = ngx_posted_events;
527 } 554 }
528 555
529 continue; 556 continue;
530 } 557 }
531 558
532 #endif
533
534 ev->event_handler(ev); 559 ev->event_handler(ev);
535 } 560 }
536 561
537 #if (NGX_THREADS0)
538 ngx_mutex_unlock(ngx_posted_events_mutex); 562 ngx_mutex_unlock(ngx_posted_events_mutex);
539 #endif 563
564 if (ngx_accept_token) {
565 *ngx_accept_mutex = 0;
566 }
540 567
541 if (timer && delta) { 568 if (timer && delta) {
542 ngx_event_expire_timers((ngx_msec_t) delta); 569 ngx_event_expire_timers((ngx_msec_t) delta);
543 } 570 }
544 571
545 #if (NGX_THREADS0) 572 #if (NGX_THREADS)
546 if (!ngx_threaded) { 573 if (ngx_threaded) {
547 } 574 return NGX_OK;
548 #endif 575 }
549 576 #endif
550 /* TODO: non-thread mode only */
551 577
552 for ( ;; ) { 578 for ( ;; ) {
553 579
554 ev = (ngx_event_t *) ngx_posted_events; 580 ev = (ngx_event_t *) ngx_posted_events;
581
582 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
583 "kevent: posted event " PTR_FMT, ev);
555 584
556 if (ev == NULL) { 585 if (ev == NULL) {
557 break; 586 break;
558 } 587 }
559 588
560 ngx_posted_events = ev->next; 589 ngx_posted_events = ev->next;
561 590
591 if ((!ev->posted && !ev->active)
592 || ev->instance != ev->returned_instance)
593 {
594 /*
595 * the stale event from a file descriptor
596 * that was just closed in this iteration
597 */
598
599 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
600 "kevent: stale event " PTR_FMT, ev);
601 continue;
602 }
603
604 if (ev->posted) {
605 ev->posted = 0;
606 }
607
562 ev->event_handler(ev); 608 ev->event_handler(ev);
563 } 609 }
564 610
565 return NGX_OK; 611 return NGX_OK;
566 } 612 }
573 ngx_int_t instance; 619 ngx_int_t instance;
574 620
575 instance = (uintptr_t) ev & 1; 621 instance = (uintptr_t) ev & 1;
576 ev = (ngx_event_t *) ((uintptr_t) ev & (uintptr_t) ~1); 622 ev = (ngx_event_t *) ((uintptr_t) ev & (uintptr_t) ~1);
577 623
578 if (ev->active == 0 || ev->instance != instance) { 624 if ((!ev->posted && !ev->active)
579 625 || ev->instance != ev->returned_instance)
626 {
580 /* 627 /*
581 * the stale event from a file descriptor 628 * the stale event from a file descriptor
582 * that was just closed in this iteration 629 * that was just closed in this iteration
583 */ 630 */
584 631
585 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ev->log, 0, 632 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ev->log, 0,
586 "kevent: stale event " PTR_FMT, ev); 633 "kevent: stale event " PTR_FMT, ev);
587 return; 634 return;
588 } 635 }
589 636
637 if (ev->posted) {
638 ev->posted = 0;
639 }
640
590 ev->event_handler(ev); 641 ev->event_handler(ev);
591 } 642 }
592 643
593 #endif 644 #endif
594 645