nginx-0.0.7-2004-06-27-22:01:57 import
diff --git a/src/event/ngx_event_posted.c b/src/event/ngx_event_posted.c
index 96475f3..4787443 100644
--- a/src/event/ngx_event_posted.c
+++ b/src/event/ngx_event_posted.c
@@ -5,8 +5,10 @@
ngx_thread_volatile ngx_event_t *ngx_posted_events;
+
#if (NGX_THREADS)
ngx_mutex_t *ngx_posted_events_mutex;
+ngx_cv_t *ngx_posted_events_cv;
#endif
@@ -55,26 +57,70 @@
#if (NGX_THREADS)
-void ngx_event_thread_handler(ngx_event_t *ev)
+ngx_int_t ngx_event_thread_process_posted(ngx_cycle_t *cycle)
{
- if ((!ev->posted && !ev->active)
- || (ev->use_instance && ev->instance != ev->returned_instance))
- {
- /*
- * the stale event from a file descriptor
- * that was just closed in this iteration
- */
+ ngx_event_t *ev, **ep;
- ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ev->log, 0,
- "kevent: stale event " PTR_FMT, ev);
- return;
+ for ( ;; ) {
+
+ ev = (ngx_event_t *) ngx_posted_events;
+ ep = (ngx_event_t **) &ngx_posted_events;
+
+ for ( ;; ) {
+
+ ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
+ "posted event " PTR_FMT, ev);
+
+ if (ev == NULL) {
+ ngx_mutex_unlock(ngx_posted_events_mutex);
+ return NGX_OK;
+ }
+
+ if (ngx_trylock(ev->lock) == NGX_BUSY) {
+
+ ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
+ "posted event " PTR_FMT " is busy", ev);
+
+ ep = &ev->next;
+ ev = ev->next;
+ continue;
+ }
+
+ *ep = ev->next;
+
+ if ((!ev->posted && !ev->active)
+ || (ev->use_instance && ev->instance != ev->returned_instance))
+ {
+ /*
+ * the stale event from a file descriptor
+ * that was just closed in this iteration
+ */
+
+ ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ev->log, 0,
+ "kevent: stale event " PTR_FMT, ev);
+
+ ev = ev->next;
+
+ continue;
+ }
+
+ ngx_mutex_unlock(ngx_posted_events_mutex);
+
+ if (ev->posted) {
+ ev->posted = 0;
+ }
+
+ ev->event_handler(ev);
+
+ *(ev->lock) = 0;
+
+ if (ngx_mutex_lock(ngx_posted_events_mutex) == NGX_ERROR) {
+ return NGX_ERROR;
+ }
+
+ break;
+ }
}
-
- if (ev->posted) {
- ev->posted = 0;
- }
-
- ev->event_handler(ev);
}
#endif