Mercurial > hg > nginx
diff src/event/ngx_event_posted.c @ 370:54f76b0b8dca
nginx-0.0.7-2004-06-27-22:01:57 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Sun, 27 Jun 2004 18:01:57 +0000 |
parents | 7b96b7f8a6af |
children | 780e93985b93 |
line wrap: on
line diff
--- 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 @@ void ngx_event_process_posted(ngx_cycle_ #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; + + 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; - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ev->log, 0, - "kevent: stale event " PTR_FMT, ev); - return; - } + 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; + } - if (ev->posted) { - ev->posted = 0; + 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; + } } - - ev->event_handler(ev); } #endif