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