130 lines
3.1 KiB
C
130 lines
3.1 KiB
C
|
|
||
|
volitile int ngx_last_posted_event;
|
||
|
|
||
|
|
||
|
typedef struct {
|
||
|
ngx_tid_t tid;
|
||
|
ngx_cv_t cv;
|
||
|
} ngx_thread_data_t;
|
||
|
|
||
|
static ngx_thread_data_t *threead_data;
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
{
|
||
|
|
||
|
err = ngx_thread_cond_wait(ngx_thread_data_cv, ngx_thread_data_mutex);
|
||
|
|
||
|
tid = ngx_thread_self();
|
||
|
|
||
|
for (i = 0; i < thread_data_n; i++) {
|
||
|
if (thread_data[i].tid == tid) {
|
||
|
cv = thread_data[i].cv;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (i == thread_data_n) {
|
||
|
error
|
||
|
return
|
||
|
}
|
||
|
|
||
|
|
||
|
for ( ;; ) {
|
||
|
|
||
|
err = ngx_thread_cond_wait(cv, ngx_posted_events_mutex);
|
||
|
if (err) {
|
||
|
ngx_log_error(NGX_ALERT, log, err,
|
||
|
ngx_thread_cond_wait_n " failed, thread is exiting");
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
for ( ;; ) {
|
||
|
ev = NULL;
|
||
|
|
||
|
for (i = ngx_last_posted_event; i > 0; i--) {
|
||
|
ev = ngx_posted_events[i];
|
||
|
|
||
|
if (ev == NULL) {
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
err = ngx_thread_mutex_trylock(ev->mutex);
|
||
|
|
||
|
if (err == 0) {
|
||
|
ngx_posted_events[i] = NULL;
|
||
|
|
||
|
while (ngx_posted_events[ngx_last_posted_event] == NULL) {
|
||
|
ngx_last_posted_event--;
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if (err == NGX_EBUSY) {
|
||
|
ev = NULL;
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
ngx_log_error(NGX_ALERT, log, err,
|
||
|
ngx_thread_mutex_unlock_n " failed,
|
||
|
thread is exiting");
|
||
|
|
||
|
ngx_worker_thread_error();
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
err = ngx_thread_mutex_unlock(ngx_posted_events_mutex);
|
||
|
if (err) {
|
||
|
ngx_log_error(NGX_ALERT, log, err,
|
||
|
ngx_thread_mutex_unlock_n
|
||
|
" failed, thread exiting");
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (ev == NULL) {
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
ngx_event_handle_event(ev);
|
||
|
|
||
|
err = ngx_thread_mutex_unlock(ev->mutex);
|
||
|
if (err) {
|
||
|
ngx_log_error(NGX_ALERT, log, err,
|
||
|
ngx_thread_mutex_unlock_n
|
||
|
" failed, thread exiting");
|
||
|
|
||
|
ngx_worker_thread_error();
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
err = ngx_thread_mutex_lock(ngx_posted_events_mutex);
|
||
|
if (err) {
|
||
|
ngx_log_error(NGX_ALERT, log, err,
|
||
|
ngx_thread_mutex_lock_n
|
||
|
" failed, thread exiting");
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (restart) {
|
||
|
ngx_log_error(NGX_INFO, log, 0, "thread is exiting");
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
ngx_worker_thread_error()
|
||
|
{
|
||
|
ngx_err_t err;
|
||
|
|
||
|
err = ngx_thread_mutex_unlock(ngx_posted_events_mutex);
|
||
|
if (err) {
|
||
|
ngx_log_error(NGX_ALERT, log, err,
|
||
|
ngx_thread_mutex_unlock_n
|
||
|
" failed, thread exiting");
|
||
|
}
|
||
|
}
|