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