xref: /unit/src/nxt_thread_cond.c (revision 0)
1*0Sigor@sysoev.ru 
2*0Sigor@sysoev.ru /*
3*0Sigor@sysoev.ru  * Copyright (C) Igor Sysoev
4*0Sigor@sysoev.ru  * Copyright (C) NGINX, Inc.
5*0Sigor@sysoev.ru  */
6*0Sigor@sysoev.ru 
7*0Sigor@sysoev.ru #include <nxt_main.h>
8*0Sigor@sysoev.ru 
9*0Sigor@sysoev.ru 
10*0Sigor@sysoev.ru nxt_int_t
11*0Sigor@sysoev.ru nxt_thread_cond_create(nxt_thread_cond_t *cond)
12*0Sigor@sysoev.ru {
13*0Sigor@sysoev.ru     nxt_err_t  err;
14*0Sigor@sysoev.ru 
15*0Sigor@sysoev.ru     err = pthread_cond_init(cond, NULL);
16*0Sigor@sysoev.ru     if (err == 0) {
17*0Sigor@sysoev.ru         nxt_thread_log_debug("pthread_cond_init(%p)", cond);
18*0Sigor@sysoev.ru         return NXT_OK;
19*0Sigor@sysoev.ru     }
20*0Sigor@sysoev.ru 
21*0Sigor@sysoev.ru     nxt_thread_log_emerg("pthread_cond_init() failed %E", err);
22*0Sigor@sysoev.ru     return NXT_ERROR;
23*0Sigor@sysoev.ru }
24*0Sigor@sysoev.ru 
25*0Sigor@sysoev.ru 
26*0Sigor@sysoev.ru void
27*0Sigor@sysoev.ru nxt_thread_cond_destroy(nxt_thread_cond_t *cond)
28*0Sigor@sysoev.ru {
29*0Sigor@sysoev.ru     nxt_err_t  err;
30*0Sigor@sysoev.ru 
31*0Sigor@sysoev.ru     err = pthread_cond_destroy(cond);
32*0Sigor@sysoev.ru     if (err != 0) {
33*0Sigor@sysoev.ru         nxt_thread_log_alert("pthread_cond_destroy() failed %E", err);
34*0Sigor@sysoev.ru     }
35*0Sigor@sysoev.ru 
36*0Sigor@sysoev.ru     nxt_thread_log_debug("pthread_cond_destroy(%p)", cond);
37*0Sigor@sysoev.ru }
38*0Sigor@sysoev.ru 
39*0Sigor@sysoev.ru 
40*0Sigor@sysoev.ru nxt_int_t
41*0Sigor@sysoev.ru nxt_thread_cond_signal(nxt_thread_cond_t *cond)
42*0Sigor@sysoev.ru {
43*0Sigor@sysoev.ru     nxt_err_t  err;
44*0Sigor@sysoev.ru 
45*0Sigor@sysoev.ru     err = pthread_cond_signal(cond);
46*0Sigor@sysoev.ru     if (nxt_fast_path(err == 0)) {
47*0Sigor@sysoev.ru         nxt_thread_log_debug("pthread_cond_signal(%p)", cond);
48*0Sigor@sysoev.ru         return NXT_OK;
49*0Sigor@sysoev.ru     }
50*0Sigor@sysoev.ru 
51*0Sigor@sysoev.ru     nxt_thread_log_alert("pthread_cond_signal() failed %E", err);
52*0Sigor@sysoev.ru 
53*0Sigor@sysoev.ru     return NXT_ERROR;
54*0Sigor@sysoev.ru }
55*0Sigor@sysoev.ru 
56*0Sigor@sysoev.ru 
57*0Sigor@sysoev.ru nxt_err_t
58*0Sigor@sysoev.ru nxt_thread_cond_wait(nxt_thread_cond_t *cond, nxt_thread_mutex_t *mtx,
59*0Sigor@sysoev.ru     nxt_nsec_t timeout)
60*0Sigor@sysoev.ru {
61*0Sigor@sysoev.ru     nxt_err_t        err;
62*0Sigor@sysoev.ru     nxt_nsec_t       ns;
63*0Sigor@sysoev.ru     nxt_thread_t     *thr;
64*0Sigor@sysoev.ru     nxt_realtime_t   *now;
65*0Sigor@sysoev.ru     struct timespec  ts;
66*0Sigor@sysoev.ru 
67*0Sigor@sysoev.ru     thr = nxt_thread();
68*0Sigor@sysoev.ru 
69*0Sigor@sysoev.ru     if (timeout == NXT_INFINITE_NSEC) {
70*0Sigor@sysoev.ru         nxt_log_debug(thr->log, "pthread_cond_wait(%p) enter", cond);
71*0Sigor@sysoev.ru 
72*0Sigor@sysoev.ru         err = pthread_cond_wait(cond, mtx);
73*0Sigor@sysoev.ru 
74*0Sigor@sysoev.ru         nxt_thread_time_update(thr);
75*0Sigor@sysoev.ru 
76*0Sigor@sysoev.ru         if (nxt_fast_path(err == 0)) {
77*0Sigor@sysoev.ru             nxt_log_debug(thr->log, "pthread_cond_wait(%p) exit", cond);
78*0Sigor@sysoev.ru             return 0;
79*0Sigor@sysoev.ru         }
80*0Sigor@sysoev.ru 
81*0Sigor@sysoev.ru         nxt_log_alert(thr->log, "pthread_cond_wait() failed %E", err);
82*0Sigor@sysoev.ru 
83*0Sigor@sysoev.ru     } else {
84*0Sigor@sysoev.ru         nxt_log_debug(thr->log, "pthread_cond_timedwait(%p, %N) enter",
85*0Sigor@sysoev.ru                       cond, timeout);
86*0Sigor@sysoev.ru 
87*0Sigor@sysoev.ru         now = nxt_thread_realtime(thr);
88*0Sigor@sysoev.ru 
89*0Sigor@sysoev.ru         ns = now->nsec + timeout;
90*0Sigor@sysoev.ru         ts.tv_sec = now->sec + ns / 1000000000;
91*0Sigor@sysoev.ru         ts.tv_nsec = ns % 1000000000;
92*0Sigor@sysoev.ru 
93*0Sigor@sysoev.ru         err = pthread_cond_timedwait(cond, mtx, &ts);
94*0Sigor@sysoev.ru 
95*0Sigor@sysoev.ru         nxt_thread_time_update(thr);
96*0Sigor@sysoev.ru 
97*0Sigor@sysoev.ru         if (nxt_fast_path(err == 0 || err == NXT_ETIMEDOUT)) {
98*0Sigor@sysoev.ru             nxt_log_debug(thr->log, "pthread_cond_timedwait(%p) exit: %d",
99*0Sigor@sysoev.ru                           cond, err);
100*0Sigor@sysoev.ru             return err;
101*0Sigor@sysoev.ru         }
102*0Sigor@sysoev.ru 
103*0Sigor@sysoev.ru         nxt_log_alert(thr->log, "pthread_cond_timedwait() failed %E", err);
104*0Sigor@sysoev.ru     }
105*0Sigor@sysoev.ru 
106*0Sigor@sysoev.ru     return NXT_ERROR;
107*0Sigor@sysoev.ru }
108