Mercurial > hg > nginx-quic
comparison src/os/unix/ngx_freebsd_rfork_thread.c @ 371:780e93985b93
nginx-0.0.7-2004-06-28-20:05:02 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Mon, 28 Jun 2004 16:05:02 +0000 |
parents | 54f76b0b8dca |
children | c9fdfccebc49 |
comparison
equal
deleted
inserted
replaced
370:54f76b0b8dca | 371:780e93985b93 |
---|---|
457 return NGX_ERROR; | 457 return NGX_ERROR; |
458 } | 458 } |
459 | 459 |
460 /* free the mutex */ | 460 /* free the mutex */ |
461 | 461 |
462 #if 0 | |
463 ngx_log_debug2(NGX_LOG_DEBUG_CORE, m->log, 0, | |
464 "unlock mutex " PTR_FMT " lock:%X", m, old); | |
465 #endif | |
466 | |
462 for ( ;; ) { | 467 for ( ;; ) { |
463 lock = old & ~NGX_MUTEX_LOCK_BUSY; | 468 lock = old & ~NGX_MUTEX_LOCK_BUSY; |
464 | 469 |
465 if (ngx_atomic_cmp_set(&m->lock, old, lock)) { | 470 if (ngx_atomic_cmp_set(&m->lock, old, lock)) { |
466 break; | 471 break; |
522 | 527 |
523 return NGX_OK; | 528 return NGX_OK; |
524 } | 529 } |
525 | 530 |
526 | 531 |
527 ngx_cv_t *ngx_cv_init(ngx_log_t *log) | 532 ngx_cond_t *ngx_cond_init(ngx_log_t *log) |
528 { | 533 { |
529 ngx_cv_t *cv; | 534 ngx_cond_t *cv; |
530 u_short val[2]; | |
531 union semun op; | 535 union semun op; |
532 | 536 |
533 if (!(cv = ngx_alloc(sizeof(ngx_cv_t), log))) { | 537 if (!(cv = ngx_alloc(sizeof(ngx_cond_t), log))) { |
534 return NULL; | 538 return NULL; |
535 } | 539 } |
536 | 540 |
537 cv->mutex.lock = 0; | 541 cv->log = log; |
538 cv->mutex.log = log; | 542 |
539 | 543 cv->semid = semget(IPC_PRIVATE, 2, SEM_R|SEM_A); |
540 cv->mutex.semid = semget(IPC_PRIVATE, 2, SEM_R|SEM_A); | 544 if (cv->semid == -1) { |
541 if (cv->mutex.semid == -1) { | |
542 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "semget() failed"); | 545 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "semget() failed"); |
543 return NULL; | 546 return NULL; |
544 } | 547 } |
545 | 548 |
546 val[0] = 0; | 549 op.val = 0; |
547 val[1] = 0; | 550 |
548 op.array = val; | 551 if (semctl(cv->semid, 0, SETVAL, op) == -1) { |
549 | 552 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "semctl(SETVAL) failed"); |
550 if (semctl(cv->mutex.semid, 0, SETALL, op) == -1) { | 553 |
551 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "semctl(SETALL) failed"); | 554 if (semctl(cv->semid, 0, IPC_RMID) == -1) { |
552 | |
553 if (semctl(cv->mutex.semid, 0, IPC_RMID) == -1) { | |
554 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, | 555 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, |
555 "semctl(IPC_RMID) failed"); | 556 "semctl(IPC_RMID) failed"); |
556 } | 557 } |
557 | 558 |
558 return NULL; | 559 return NULL; |
560 | 561 |
561 return cv; | 562 return cv; |
562 } | 563 } |
563 | 564 |
564 | 565 |
565 void ngx_cv_done(ngx_cv_t *cv) | 566 void ngx_cond_done(ngx_cond_t *cv) |
566 { | 567 { |
567 if (semctl(cv->mutex.semid, 0, IPC_RMID) == -1) { | 568 if (semctl(cv->semid, 0, IPC_RMID) == -1) { |
568 ngx_log_error(NGX_LOG_ALERT, cv->mutex.log, ngx_errno, | 569 ngx_log_error(NGX_LOG_ALERT, cv->log, ngx_errno, |
569 "semctl(IPC_RMID) failed"); | 570 "semctl(IPC_RMID) failed"); |
570 } | 571 } |
571 | 572 |
572 ngx_free(cv); | 573 ngx_free(cv); |
573 } | 574 } |
574 | 575 |
575 | 576 |
576 ngx_int_t ngx_cv_wait(ngx_cv_t *cv) | 577 ngx_int_t ngx_cond_wait(ngx_cond_t *cv, ngx_mutex_t *m) |
577 { | 578 { |
578 struct sembuf op[2]; | 579 struct sembuf op; |
579 | 580 |
580 ngx_log_debug1(NGX_LOG_DEBUG_CORE, cv->mutex.log, 0, | 581 ngx_log_debug1(NGX_LOG_DEBUG_CORE, cv->log, 0, |
581 "cv " PTR_FMT " wait", cv); | 582 "cv " PTR_FMT " wait", cv); |
582 | 583 |
583 op[0].sem_num = 0; | 584 op.sem_num = 0; |
584 op[0].sem_op = -1; | 585 op.sem_op = -1; |
585 op[0].sem_flg = SEM_UNDO; | 586 op.sem_flg = SEM_UNDO; |
586 | 587 |
587 op[1].sem_num = 1; | 588 if (semop(cv->semid, &op, 1) == -1) { |
588 op[1].sem_op = -1; | 589 ngx_log_error(NGX_LOG_ALERT, cv->log, ngx_errno, |
589 op[1].sem_flg = SEM_UNDO; | |
590 | |
591 if (semop(cv->mutex.semid, op, 2) == -1) { | |
592 ngx_log_error(NGX_LOG_ALERT, cv->mutex.log, ngx_errno, | |
593 "semop() failed while waiting on cv " PTR_FMT, cv); | 590 "semop() failed while waiting on cv " PTR_FMT, cv); |
594 return NGX_ERROR; | 591 return NGX_ERROR; |
595 } | 592 } |
596 | 593 |
597 ngx_log_debug1(NGX_LOG_DEBUG_CORE, cv->mutex.log, 0, | 594 ngx_log_debug1(NGX_LOG_DEBUG_CORE, cv->log, 0, |
598 "cv " PTR_FMT " is waked up", cv); | 595 "cv " PTR_FMT " is waked up", cv); |
599 | 596 |
597 if (ngx_mutex_lock(m) == NGX_ERROR) { | |
598 return NGX_ERROR; | |
599 } | |
600 | |
600 return NGX_OK; | 601 return NGX_OK; |
601 } | 602 } |
602 | 603 |
603 | 604 |
604 ngx_int_t ngx_cv_signal(ngx_cv_t *cv) | 605 ngx_int_t ngx_cond_signal(ngx_cond_t *cv) |
605 { | 606 { |
606 struct sembuf op[2]; | 607 struct sembuf op; |
607 | 608 |
608 ngx_log_debug1(NGX_LOG_DEBUG_CORE, cv->mutex.log, 0, | 609 ngx_log_debug1(NGX_LOG_DEBUG_CORE, cv->log, 0, |
609 "cv " PTR_FMT " to signal", cv); | 610 "cv " PTR_FMT " to signal", cv); |
610 | 611 |
611 op[0].sem_num = 0; | 612 op.sem_num = 0; |
612 op[0].sem_op = 1; | 613 op.sem_op = 1; |
613 op[0].sem_flg = SEM_UNDO; | 614 op.sem_flg = SEM_UNDO; |
614 | 615 |
615 op[1].sem_num = 1; | 616 if (semop(cv->semid, &op, 1) == -1) { |
616 op[1].sem_op = 1; | 617 ngx_log_error(NGX_LOG_ALERT, cv->log, ngx_errno, |
617 op[1].sem_flg = SEM_UNDO; | |
618 | |
619 if (semop(cv->mutex.semid, op, 2) == -1) { | |
620 ngx_log_error(NGX_LOG_ALERT, cv->mutex.log, ngx_errno, | |
621 "semop() failed while signaling cv " PTR_FMT, cv); | 618 "semop() failed while signaling cv " PTR_FMT, cv); |
622 return NGX_ERROR; | 619 return NGX_ERROR; |
623 } | 620 } |
624 | 621 |
625 ngx_log_debug1(NGX_LOG_DEBUG_CORE, cv->mutex.log, 0, | 622 ngx_log_debug1(NGX_LOG_DEBUG_CORE, cv->log, 0, |
626 "cv " PTR_FMT " is signaled", cv); | 623 "cv " PTR_FMT " is signaled", cv); |
627 | 624 |
628 return NGX_OK; | 625 return NGX_OK; |
629 } | 626 } |