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"); } }