3 * Copyright (C) Igor Sysoev
4 * Copyright (C) Nginx, Inc.
8 #include <ngx_config.h>
12 static ngx_uint_t nthreads
;
13 static ngx_uint_t max_threads
;
16 static pthread_attr_t thr_attr
;
20 ngx_create_thread(ngx_tid_t
*tid
, ngx_thread_value_t (*func
)(void *arg
),
21 void *arg
, ngx_log_t
*log
)
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
);
31 err
= pthread_create(tid
, &thr_attr
, func
, arg
);
34 ngx_log_error(NGX_LOG_ALERT
, log
, err
, "pthread_create() failed");
38 ngx_log_debug1(NGX_LOG_DEBUG_CORE
, log
, 0,
39 "thread is created: " NGX_TID_T_FMT
, *tid
);
48 ngx_init_threads(int n
, size_t size
, ngx_cycle_t
*cycle
)
54 err
= pthread_attr_init(&thr_attr
);
57 ngx_log_error(NGX_LOG_ALERT
, cycle
->log
, err
,
58 "pthread_attr_init() failed");
62 err
= pthread_attr_setstacksize(&thr_attr
, size
);
65 ngx_log_error(NGX_LOG_ALERT
, cycle
->log
, err
,
66 "pthread_attr_setstacksize() failed");
77 ngx_mutex_init(ngx_log_t
*log
, ngx_uint_t flags
)
82 m
= ngx_alloc(sizeof(ngx_mutex_t
), log
);
89 err
= pthread_mutex_init(&m
->mutex
, NULL
);
92 ngx_log_error(NGX_LOG_ALERT
, m
->log
, err
,
93 "pthread_mutex_init() failed");
102 ngx_mutex_destroy(ngx_mutex_t
*m
)
106 err
= pthread_mutex_destroy(&m
->mutex
);
109 ngx_log_error(NGX_LOG_ALERT
, m
->log
, err
,
110 "pthread_mutex_destroy(%p) failed", m
);
118 ngx_mutex_lock(ngx_mutex_t
*m
)
126 ngx_log_debug1(NGX_LOG_DEBUG_MUTEX
, m
->log
, 0, "lock mutex %p", m
);
128 err
= pthread_mutex_lock(&m
->mutex
);
131 ngx_log_error(NGX_LOG_ALERT
, m
->log
, err
,
132 "pthread_mutex_lock(%p) failed", m
);
136 ngx_log_debug1(NGX_LOG_DEBUG_MUTEX
, m
->log
, 0, "mutex %p is locked", m
);
143 ngx_mutex_trylock(ngx_mutex_t
*m
)
151 ngx_log_debug1(NGX_LOG_DEBUG_MUTEX
, m
->log
, 0, "try lock mutex %p", m
);
153 err
= pthread_mutex_trylock(&m
->mutex
);
155 if (err
== NGX_EBUSY
) {
160 ngx_log_error(NGX_LOG_ALERT
, m
->log
, err
,
161 "pthread_mutex_trylock(%p) failed", m
);
165 ngx_log_debug1(NGX_LOG_DEBUG_MUTEX
, m
->log
, 0, "mutex %p is locked", m
);
172 ngx_mutex_unlock(ngx_mutex_t
*m
)
180 ngx_log_debug1(NGX_LOG_DEBUG_MUTEX
, m
->log
, 0, "unlock mutex %p", m
);
182 err
= pthread_mutex_unlock(&m
->mutex
);
185 ngx_log_error(NGX_LOG_ALERT
, m
->log
, err
,
186 "pthread_mutex_unlock(%p) failed", m
);
190 ngx_log_debug1(NGX_LOG_DEBUG_MUTEX
, m
->log
, 0, "mutex %p is unlocked", m
);
197 ngx_cond_init(ngx_log_t
*log
)
202 cv
= ngx_alloc(sizeof(ngx_cond_t
), log
);
209 err
= pthread_cond_init(&cv
->cond
, NULL
);
212 ngx_log_error(NGX_LOG_ALERT
, cv
->log
, err
,
213 "pthread_cond_init() failed");
222 ngx_cond_destroy(ngx_cond_t
*cv
)
226 err
= pthread_cond_destroy(&cv
->cond
);
229 ngx_log_error(NGX_LOG_ALERT
, cv
->log
, err
,
230 "pthread_cond_destroy(%p) failed", cv
);
238 ngx_cond_wait(ngx_cond_t
*cv
, ngx_mutex_t
*m
)
242 ngx_log_debug1(NGX_LOG_DEBUG_CORE
, cv
->log
, 0, "cv %p wait", cv
);
244 err
= pthread_cond_wait(&cv
->cond
, &m
->mutex
);
247 ngx_log_error(NGX_LOG_ALERT
, cv
->log
, err
,
248 "pthread_cond_wait(%p) failed", cv
);
252 ngx_log_debug1(NGX_LOG_DEBUG_CORE
, cv
->log
, 0, "cv %p is waked up", cv
);
254 ngx_log_debug1(NGX_LOG_DEBUG_MUTEX
, m
->log
, 0, "mutex %p is locked", m
);
261 ngx_cond_signal(ngx_cond_t
*cv
)
265 ngx_log_debug1(NGX_LOG_DEBUG_CORE
, cv
->log
, 0, "cv %p to signal", cv
);
267 err
= pthread_cond_signal(&cv
->cond
);
270 ngx_log_error(NGX_LOG_ALERT
, cv
->log
, err
,
271 "pthread_cond_signal(%p) failed", cv
);
275 ngx_log_debug1(NGX_LOG_DEBUG_CORE
, cv
->log
, 0, "cv %p is signaled", cv
);