aboutsummaryrefslogtreecommitdiff
path: root/src/event/ngx_event_thread.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/event/ngx_event_thread.c')
-rw-r--r--src/event/ngx_event_thread.c129
1 files changed, 129 insertions, 0 deletions
diff --git a/src/event/ngx_event_thread.c b/src/event/ngx_event_thread.c
new file mode 100644
index 000000000..527b49cd0
--- /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");
+ }
+}