ngx_event_posted.c

来自「Nginx是一个高性能的HTTP和反向代理服务器」· C语言 代码 · 共 173 行

C
173
字号
/* * Copyright (C) Igor Sysoev */#include <ngx_config.h>#include <ngx_core.h>#include <ngx_event.h>ngx_thread_volatile ngx_event_t  *ngx_posted_accept_events;ngx_thread_volatile ngx_event_t  *ngx_posted_events;#if (NGX_THREADS)ngx_mutex_t                      *ngx_posted_events_mutex;#endifvoidngx_event_process_posted(ngx_cycle_t *cycle,    ngx_thread_volatile ngx_event_t **posted){    ngx_event_t  *ev;    for ( ;; ) {        ev = (ngx_event_t *) *posted;        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,                      "posted event %p", ev);        if (ev == NULL) {            return;        }        ngx_delete_posted_event(ev);        ev->handler(ev);    }}#if (NGX_THREADS) && !(NGX_WIN32)voidngx_wakeup_worker_thread(ngx_cycle_t *cycle){    ngx_int_t     i;#if 0    ngx_uint_t    busy;    ngx_event_t  *ev;    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_tngx_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 %p", 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 %p 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 %p 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 (NGX_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 (NGX_HAVE_KQUEUE)            ev->posted_errno = 0;#endif            ev->posted_available = 0;            ngx_mutex_unlock(ngx_posted_events_mutex);            ev->handler(ev);            ngx_mutex_lock(ngx_posted_events_mutex);            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 %p is done", ev);            break;        }    }}#elsevoidngx_wakeup_worker_thread(ngx_cycle_t *cycle){}#endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?