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 }