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