xref: /unit/src/nxt_thread_cond.c (revision 564:762f8c976ead)
10Sigor@sysoev.ru 
20Sigor@sysoev.ru /*
30Sigor@sysoev.ru  * Copyright (C) Igor Sysoev
40Sigor@sysoev.ru  * Copyright (C) NGINX, Inc.
50Sigor@sysoev.ru  */
60Sigor@sysoev.ru 
70Sigor@sysoev.ru #include <nxt_main.h>
80Sigor@sysoev.ru 
90Sigor@sysoev.ru 
100Sigor@sysoev.ru nxt_int_t
nxt_thread_cond_create(nxt_thread_cond_t * cond)110Sigor@sysoev.ru nxt_thread_cond_create(nxt_thread_cond_t *cond)
120Sigor@sysoev.ru {
130Sigor@sysoev.ru     nxt_err_t  err;
140Sigor@sysoev.ru 
150Sigor@sysoev.ru     err = pthread_cond_init(cond, NULL);
160Sigor@sysoev.ru     if (err == 0) {
170Sigor@sysoev.ru         nxt_thread_log_debug("pthread_cond_init(%p)", cond);
180Sigor@sysoev.ru         return NXT_OK;
190Sigor@sysoev.ru     }
200Sigor@sysoev.ru 
21*564Svbart@nginx.com     nxt_thread_log_alert("pthread_cond_init() failed %E", err);
220Sigor@sysoev.ru     return NXT_ERROR;
230Sigor@sysoev.ru }
240Sigor@sysoev.ru 
250Sigor@sysoev.ru 
260Sigor@sysoev.ru void
nxt_thread_cond_destroy(nxt_thread_cond_t * cond)270Sigor@sysoev.ru nxt_thread_cond_destroy(nxt_thread_cond_t *cond)
280Sigor@sysoev.ru {
290Sigor@sysoev.ru     nxt_err_t  err;
300Sigor@sysoev.ru 
310Sigor@sysoev.ru     err = pthread_cond_destroy(cond);
320Sigor@sysoev.ru     if (err != 0) {
330Sigor@sysoev.ru         nxt_thread_log_alert("pthread_cond_destroy() failed %E", err);
340Sigor@sysoev.ru     }
350Sigor@sysoev.ru 
360Sigor@sysoev.ru     nxt_thread_log_debug("pthread_cond_destroy(%p)", cond);
370Sigor@sysoev.ru }
380Sigor@sysoev.ru 
390Sigor@sysoev.ru 
400Sigor@sysoev.ru nxt_int_t
nxt_thread_cond_signal(nxt_thread_cond_t * cond)410Sigor@sysoev.ru nxt_thread_cond_signal(nxt_thread_cond_t *cond)
420Sigor@sysoev.ru {
430Sigor@sysoev.ru     nxt_err_t  err;
440Sigor@sysoev.ru 
450Sigor@sysoev.ru     err = pthread_cond_signal(cond);
460Sigor@sysoev.ru     if (nxt_fast_path(err == 0)) {
470Sigor@sysoev.ru         nxt_thread_log_debug("pthread_cond_signal(%p)", cond);
480Sigor@sysoev.ru         return NXT_OK;
490Sigor@sysoev.ru     }
500Sigor@sysoev.ru 
510Sigor@sysoev.ru     nxt_thread_log_alert("pthread_cond_signal() failed %E", err);
520Sigor@sysoev.ru 
530Sigor@sysoev.ru     return NXT_ERROR;
540Sigor@sysoev.ru }
550Sigor@sysoev.ru 
560Sigor@sysoev.ru 
570Sigor@sysoev.ru nxt_err_t
nxt_thread_cond_wait(nxt_thread_cond_t * cond,nxt_thread_mutex_t * mtx,nxt_nsec_t timeout)580Sigor@sysoev.ru nxt_thread_cond_wait(nxt_thread_cond_t *cond, nxt_thread_mutex_t *mtx,
590Sigor@sysoev.ru     nxt_nsec_t timeout)
600Sigor@sysoev.ru {
610Sigor@sysoev.ru     nxt_err_t        err;
620Sigor@sysoev.ru     nxt_nsec_t       ns;
630Sigor@sysoev.ru     nxt_thread_t     *thr;
640Sigor@sysoev.ru     nxt_realtime_t   *now;
650Sigor@sysoev.ru     struct timespec  ts;
660Sigor@sysoev.ru 
670Sigor@sysoev.ru     thr = nxt_thread();
680Sigor@sysoev.ru 
690Sigor@sysoev.ru     if (timeout == NXT_INFINITE_NSEC) {
700Sigor@sysoev.ru         nxt_log_debug(thr->log, "pthread_cond_wait(%p) enter", cond);
710Sigor@sysoev.ru 
720Sigor@sysoev.ru         err = pthread_cond_wait(cond, mtx);
730Sigor@sysoev.ru 
740Sigor@sysoev.ru         nxt_thread_time_update(thr);
750Sigor@sysoev.ru 
760Sigor@sysoev.ru         if (nxt_fast_path(err == 0)) {
770Sigor@sysoev.ru             nxt_log_debug(thr->log, "pthread_cond_wait(%p) exit", cond);
780Sigor@sysoev.ru             return 0;
790Sigor@sysoev.ru         }
800Sigor@sysoev.ru 
810Sigor@sysoev.ru         nxt_log_alert(thr->log, "pthread_cond_wait() failed %E", err);
820Sigor@sysoev.ru 
830Sigor@sysoev.ru     } else {
840Sigor@sysoev.ru         nxt_log_debug(thr->log, "pthread_cond_timedwait(%p, %N) enter",
850Sigor@sysoev.ru                       cond, timeout);
860Sigor@sysoev.ru 
870Sigor@sysoev.ru         now = nxt_thread_realtime(thr);
880Sigor@sysoev.ru 
890Sigor@sysoev.ru         ns = now->nsec + timeout;
900Sigor@sysoev.ru         ts.tv_sec = now->sec + ns / 1000000000;
910Sigor@sysoev.ru         ts.tv_nsec = ns % 1000000000;
920Sigor@sysoev.ru 
930Sigor@sysoev.ru         err = pthread_cond_timedwait(cond, mtx, &ts);
940Sigor@sysoev.ru 
950Sigor@sysoev.ru         nxt_thread_time_update(thr);
960Sigor@sysoev.ru 
970Sigor@sysoev.ru         if (nxt_fast_path(err == 0 || err == NXT_ETIMEDOUT)) {
980Sigor@sysoev.ru             nxt_log_debug(thr->log, "pthread_cond_timedwait(%p) exit: %d",
990Sigor@sysoev.ru                           cond, err);
1000Sigor@sysoev.ru             return err;
1010Sigor@sysoev.ru         }
1020Sigor@sysoev.ru 
1030Sigor@sysoev.ru         nxt_log_alert(thr->log, "pthread_cond_timedwait() failed %E", err);
1040Sigor@sysoev.ru     }
1050Sigor@sysoev.ru 
1060Sigor@sysoev.ru     return NXT_ERROR;
1070Sigor@sysoev.ru }
108