Mercurial > hg > nginx-quic
diff src/event/ngx_event_thread.c @ 208:0b67be7d4489
nginx-0.0.1-2003-12-08-23:48:12 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Mon, 08 Dec 2003 20:48:12 +0000 |
parents | |
children |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/src/event/ngx_event_thread.c @@ -0,0 +1,129 @@ + +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"); + } +}