Annotation of embedaddon/nginx/src/os/unix/ngx_pthread_thread.c, revision 1.1.1.1

1.1       misho       1: 
                      2: /*
                      3:  * Copyright (C) Igor Sysoev
                      4:  * Copyright (C) Nginx, Inc.
                      5:  */
                      6: 
                      7: 
                      8: #include <ngx_config.h>
                      9: #include <ngx_core.h>
                     10: 
                     11: 
                     12: static ngx_uint_t   nthreads;
                     13: static ngx_uint_t   max_threads;
                     14: 
                     15: 
                     16: static pthread_attr_t  thr_attr;
                     17: 
                     18: 
                     19: ngx_err_t
                     20: ngx_create_thread(ngx_tid_t *tid, ngx_thread_value_t (*func)(void *arg),
                     21:     void *arg, ngx_log_t *log)
                     22: {
                     23:     int  err;
                     24: 
                     25:     if (nthreads >= max_threads) {
                     26:         ngx_log_error(NGX_LOG_CRIT, log, 0,
                     27:                       "no more than %ui threads can be created", max_threads);
                     28:         return NGX_ERROR;
                     29:     }
                     30: 
                     31:     err = pthread_create(tid, &thr_attr, func, arg);
                     32: 
                     33:     if (err != 0) {
                     34:         ngx_log_error(NGX_LOG_ALERT, log, err, "pthread_create() failed");
                     35:         return err;
                     36:     }
                     37: 
                     38:     ngx_log_debug1(NGX_LOG_DEBUG_CORE, log, 0,
                     39:                    "thread is created: " NGX_TID_T_FMT, *tid);
                     40: 
                     41:     nthreads++;
                     42: 
                     43:     return err;
                     44: }
                     45: 
                     46: 
                     47: ngx_int_t
                     48: ngx_init_threads(int n, size_t size, ngx_cycle_t *cycle)
                     49: {
                     50:     int  err;
                     51: 
                     52:     max_threads = n;
                     53: 
                     54:     err = pthread_attr_init(&thr_attr);
                     55: 
                     56:     if (err != 0) {
                     57:         ngx_log_error(NGX_LOG_ALERT, cycle->log, err,
                     58:                       "pthread_attr_init() failed");
                     59:         return NGX_ERROR;
                     60:     }
                     61: 
                     62:     err = pthread_attr_setstacksize(&thr_attr, size);
                     63: 
                     64:     if (err != 0) {
                     65:         ngx_log_error(NGX_LOG_ALERT, cycle->log, err,
                     66:                       "pthread_attr_setstacksize() failed");
                     67:         return NGX_ERROR;
                     68:     }
                     69: 
                     70:     ngx_threaded = 1;
                     71: 
                     72:     return NGX_OK;
                     73: }
                     74: 
                     75: 
                     76: ngx_mutex_t *
                     77: ngx_mutex_init(ngx_log_t *log, ngx_uint_t flags)
                     78: {
                     79:     int           err;
                     80:     ngx_mutex_t  *m;
                     81: 
                     82:     m = ngx_alloc(sizeof(ngx_mutex_t), log);
                     83:     if (m == NULL) {
                     84:         return NULL;
                     85:     }
                     86: 
                     87:     m->log = log;
                     88: 
                     89:     err = pthread_mutex_init(&m->mutex, NULL);
                     90: 
                     91:     if (err != 0) {
                     92:         ngx_log_error(NGX_LOG_ALERT, m->log, err,
                     93:                       "pthread_mutex_init() failed");
                     94:         return NULL;
                     95:     }
                     96: 
                     97:     return m;
                     98: }
                     99: 
                    100: 
                    101: void
                    102: ngx_mutex_destroy(ngx_mutex_t *m)
                    103: {
                    104:     int  err;
                    105: 
                    106:     err = pthread_mutex_destroy(&m->mutex);
                    107: 
                    108:     if (err != 0) {
                    109:         ngx_log_error(NGX_LOG_ALERT, m->log, err,
                    110:                       "pthread_mutex_destroy(%p) failed", m);
                    111:     }
                    112: 
                    113:     ngx_free(m);
                    114: }
                    115: 
                    116: 
                    117: void
                    118: ngx_mutex_lock(ngx_mutex_t *m)
                    119: {
                    120:     int  err;
                    121: 
                    122:     if (!ngx_threaded) {
                    123:         return;
                    124:     }
                    125: 
                    126:     ngx_log_debug1(NGX_LOG_DEBUG_MUTEX, m->log, 0, "lock mutex %p", m);
                    127: 
                    128:     err = pthread_mutex_lock(&m->mutex);
                    129: 
                    130:     if (err != 0) {
                    131:         ngx_log_error(NGX_LOG_ALERT, m->log, err,
                    132:                       "pthread_mutex_lock(%p) failed", m);
                    133:         ngx_abort();
                    134:     }
                    135: 
                    136:     ngx_log_debug1(NGX_LOG_DEBUG_MUTEX, m->log, 0, "mutex %p is locked", m);
                    137: 
                    138:     return;
                    139: }
                    140: 
                    141: 
                    142: ngx_int_t
                    143: ngx_mutex_trylock(ngx_mutex_t *m)
                    144: {
                    145:     int  err;
                    146: 
                    147:     if (!ngx_threaded) {
                    148:         return NGX_OK;
                    149:     }
                    150: 
                    151:     ngx_log_debug1(NGX_LOG_DEBUG_MUTEX, m->log, 0, "try lock mutex %p", m);
                    152: 
                    153:     err = pthread_mutex_trylock(&m->mutex);
                    154: 
                    155:     if (err == NGX_EBUSY) {
                    156:         return NGX_AGAIN;
                    157:     }
                    158: 
                    159:     if (err != 0) {
                    160:         ngx_log_error(NGX_LOG_ALERT, m->log, err,
                    161:                       "pthread_mutex_trylock(%p) failed", m);
                    162:         ngx_abort();
                    163:     }
                    164: 
                    165:     ngx_log_debug1(NGX_LOG_DEBUG_MUTEX, m->log, 0, "mutex %p is locked", m);
                    166: 
                    167:     return NGX_OK;
                    168: }
                    169: 
                    170: 
                    171: void
                    172: ngx_mutex_unlock(ngx_mutex_t *m)
                    173: {
                    174:     int  err;
                    175: 
                    176:     if (!ngx_threaded) {
                    177:         return;
                    178:     }
                    179: 
                    180:     ngx_log_debug1(NGX_LOG_DEBUG_MUTEX, m->log, 0, "unlock mutex %p", m);
                    181: 
                    182:     err = pthread_mutex_unlock(&m->mutex);
                    183: 
                    184:     if (err != 0) {
                    185:         ngx_log_error(NGX_LOG_ALERT, m->log, err,
                    186:                       "pthread_mutex_unlock(%p) failed", m);
                    187:         ngx_abort();
                    188:     }
                    189: 
                    190:     ngx_log_debug1(NGX_LOG_DEBUG_MUTEX, m->log, 0, "mutex %p is unlocked", m);
                    191: 
                    192:     return;
                    193: }
                    194: 
                    195: 
                    196: ngx_cond_t *
                    197: ngx_cond_init(ngx_log_t *log)
                    198: {
                    199:     int          err;
                    200:     ngx_cond_t  *cv;
                    201: 
                    202:     cv = ngx_alloc(sizeof(ngx_cond_t), log);
                    203:     if (cv == NULL) {
                    204:         return NULL;
                    205:     }
                    206: 
                    207:     cv->log = log;
                    208: 
                    209:     err = pthread_cond_init(&cv->cond, NULL);
                    210: 
                    211:     if (err != 0) {
                    212:         ngx_log_error(NGX_LOG_ALERT, cv->log, err,
                    213:                       "pthread_cond_init() failed");
                    214:         return NULL;
                    215:     }
                    216: 
                    217:     return cv;
                    218: }
                    219: 
                    220: 
                    221: void
                    222: ngx_cond_destroy(ngx_cond_t *cv)
                    223: {
                    224:     int  err;
                    225: 
                    226:     err = pthread_cond_destroy(&cv->cond);
                    227: 
                    228:     if (err != 0) {
                    229:         ngx_log_error(NGX_LOG_ALERT, cv->log, err,
                    230:                       "pthread_cond_destroy(%p) failed", cv);
                    231:     }
                    232: 
                    233:     ngx_free(cv);
                    234: }
                    235: 
                    236: 
                    237: ngx_int_t
                    238: ngx_cond_wait(ngx_cond_t *cv, ngx_mutex_t *m)
                    239: {
                    240:     int  err;
                    241: 
                    242:     ngx_log_debug1(NGX_LOG_DEBUG_CORE, cv->log, 0, "cv %p wait", cv);
                    243: 
                    244:     err = pthread_cond_wait(&cv->cond, &m->mutex);
                    245: 
                    246:     if (err != 0) {
                    247:         ngx_log_error(NGX_LOG_ALERT, cv->log, err,
                    248:                       "pthread_cond_wait(%p) failed", cv);
                    249:         return NGX_ERROR;
                    250:     }
                    251: 
                    252:     ngx_log_debug1(NGX_LOG_DEBUG_CORE, cv->log, 0, "cv %p is waked up", cv);
                    253: 
                    254:     ngx_log_debug1(NGX_LOG_DEBUG_MUTEX, m->log, 0, "mutex %p is locked", m);
                    255: 
                    256:     return NGX_OK;
                    257: }
                    258: 
                    259: 
                    260: ngx_int_t
                    261: ngx_cond_signal(ngx_cond_t *cv)
                    262: {
                    263:     int  err;
                    264: 
                    265:     ngx_log_debug1(NGX_LOG_DEBUG_CORE, cv->log, 0, "cv %p to signal", cv);
                    266: 
                    267:     err = pthread_cond_signal(&cv->cond);
                    268: 
                    269:     if (err != 0) {
                    270:         ngx_log_error(NGX_LOG_ALERT, cv->log, err,
                    271:                       "pthread_cond_signal(%p) failed", cv);
                    272:         return NGX_ERROR;
                    273:     }
                    274: 
                    275:     ngx_log_debug1(NGX_LOG_DEBUG_CORE, cv->log, 0, "cv %p is signaled", cv);
                    276: 
                    277:     return NGX_OK;
                    278: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>