Mercurial > hg > nginx-mail
diff src/event/ngx_event_posted.c @ 0:f0b350454894 NGINX_0_1_0
nginx 0.1.0
*) The first public version.
author | Igor Sysoev <http://sysoev.ru> |
---|---|
date | Mon, 04 Oct 2004 00:00:00 +0400 |
parents | |
children | 46833bd150cb |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/src/event/ngx_event_posted.c @@ -0,0 +1,169 @@ + +/* + * Copyright (C) Igor Sysoev + */ + + +#include <ngx_config.h> +#include <ngx_core.h> +#include <ngx_event.h> + + +ngx_thread_volatile ngx_event_t *ngx_posted_events; + +#if (NGX_THREADS) +ngx_mutex_t *ngx_posted_events_mutex; +#endif + + +void ngx_event_process_posted(ngx_cycle_t *cycle) +{ + ngx_event_t *ev; + + for ( ;; ) { + + ev = (ngx_event_t *) ngx_posted_events; + + ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, + "posted event " PTR_FMT, ev); + + if (ev == NULL) { + return; + } + + ngx_delete_posted_event(ev); + + ev->event_handler(ev); + } +} + + +#if (NGX_THREADS) + +void ngx_wakeup_worker_thread(ngx_cycle_t *cycle) +{ + ngx_int_t i; + ngx_uint_t busy; + ngx_event_t *ev; + +#if 0 + busy = 1; + + if (ngx_mutex_lock(ngx_posted_events_mutex) == NGX_ERROR) { + return; + } + + for (ev = (ngx_event_t *) ngx_posted_events; ev; ev = ev->next) { + if (*(ev->lock) == 0) { + busy = 0; + break; + } + } + + ngx_mutex_unlock(ngx_posted_events_mutex); + + if (busy) { + return; + } +#endif + + for (i = 0; i < ngx_threads_n; i++) { + if (ngx_threads[i].state == NGX_THREAD_FREE) { + ngx_cond_signal(ngx_threads[i].cv); + return; + } + } +} + + +ngx_int_t ngx_event_thread_process_posted(ngx_cycle_t *cycle) +{ + ngx_event_t *ev; + + for ( ;; ) { + + ev = (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) { + return NGX_OK; + } + + if (ngx_trylock(ev->lock) == 0) { + + ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, + "posted event " PTR_FMT " is busy", ev); + + ev = ev->next; + continue; + } + + if (ev->lock != ev->own_lock) { + if (*(ev->own_lock)) { + ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, + "the own lock of the posted event " + PTR_FMT " is busy", ev); + ngx_unlock(ev->lock); + ev = ev->next; + continue; + } + *(ev->own_lock) = 1; + } + + ngx_delete_posted_event(ev); + + ev->locked = 1; + + ev->ready |= ev->posted_ready; + ev->timedout |= ev->posted_timedout; + ev->pending_eof |= ev->posted_eof; +#if (HAVE_KQUEUE) + ev->kq_errno |= ev->posted_errno; +#endif + if (ev->posted_available) { + ev->available = ev->posted_available; + } + + ev->posted_ready = 0; + ev->posted_timedout = 0; + ev->posted_eof = 0; +#if (HAVE_KQUEUE) + ev->posted_errno = 0; +#endif + ev->posted_available = 0; + + ngx_mutex_unlock(ngx_posted_events_mutex); + + ev->event_handler(ev); + + if (ngx_mutex_lock(ngx_posted_events_mutex) == NGX_ERROR) { + return NGX_ERROR; + } + + if (ev->locked) { + ngx_unlock(ev->lock); + + if (ev->lock != ev->own_lock) { + ngx_unlock(ev->own_lock); + } + } + + ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, + "posted event " PTR_FMT " is done", ev); + + break; + } + } +} + +#else + +void ngx_wakeup_worker_thread(ngx_cycle_t *cycle) +{ +} + +#endif