Annotation of embedaddon/nginx/src/event/ngx_event_posted.c, revision 1.1
1.1 ! misho 1:
! 2: /*
! 3: * Copyright (C) Igor Sysoev
! 4: * Copyright (C) Nginx, Inc.
! 5: */
! 6:
! 7:
! 8: #include <ngx_config.h>
! 9: #include <ngx_core.h>
! 10: #include <ngx_event.h>
! 11:
! 12:
! 13: ngx_thread_volatile ngx_event_t *ngx_posted_accept_events;
! 14: ngx_thread_volatile ngx_event_t *ngx_posted_events;
! 15:
! 16: #if (NGX_THREADS)
! 17: ngx_mutex_t *ngx_posted_events_mutex;
! 18: #endif
! 19:
! 20:
! 21: void
! 22: ngx_event_process_posted(ngx_cycle_t *cycle,
! 23: ngx_thread_volatile ngx_event_t **posted)
! 24: {
! 25: ngx_event_t *ev;
! 26:
! 27: for ( ;; ) {
! 28:
! 29: ev = (ngx_event_t *) *posted;
! 30:
! 31: ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
! 32: "posted event %p", ev);
! 33:
! 34: if (ev == NULL) {
! 35: return;
! 36: }
! 37:
! 38: ngx_delete_posted_event(ev);
! 39:
! 40: ev->handler(ev);
! 41: }
! 42: }
! 43:
! 44:
! 45: #if (NGX_THREADS) && !(NGX_WIN32)
! 46:
! 47: void
! 48: ngx_wakeup_worker_thread(ngx_cycle_t *cycle)
! 49: {
! 50: ngx_int_t i;
! 51: #if 0
! 52: ngx_uint_t busy;
! 53: ngx_event_t *ev;
! 54:
! 55: busy = 1;
! 56:
! 57: if (ngx_mutex_lock(ngx_posted_events_mutex) == NGX_ERROR) {
! 58: return;
! 59: }
! 60:
! 61: for (ev = (ngx_event_t *) ngx_posted_events; ev; ev = ev->next) {
! 62: if (*(ev->lock) == 0) {
! 63: busy = 0;
! 64: break;
! 65: }
! 66: }
! 67:
! 68: ngx_mutex_unlock(ngx_posted_events_mutex);
! 69:
! 70: if (busy) {
! 71: return;
! 72: }
! 73: #endif
! 74:
! 75: for (i = 0; i < ngx_threads_n; i++) {
! 76: if (ngx_threads[i].state == NGX_THREAD_FREE) {
! 77: ngx_cond_signal(ngx_threads[i].cv);
! 78: return;
! 79: }
! 80: }
! 81: }
! 82:
! 83:
! 84: ngx_int_t
! 85: ngx_event_thread_process_posted(ngx_cycle_t *cycle)
! 86: {
! 87: ngx_event_t *ev;
! 88:
! 89: for ( ;; ) {
! 90:
! 91: ev = (ngx_event_t *) ngx_posted_events;
! 92:
! 93: for ( ;; ) {
! 94:
! 95: ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
! 96: "posted event %p", ev);
! 97:
! 98: if (ev == NULL) {
! 99: return NGX_OK;
! 100: }
! 101:
! 102: if (ngx_trylock(ev->lock) == 0) {
! 103:
! 104: ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
! 105: "posted event %p is busy", ev);
! 106:
! 107: ev = ev->next;
! 108: continue;
! 109: }
! 110:
! 111: if (ev->lock != ev->own_lock) {
! 112: if (*(ev->own_lock)) {
! 113: ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
! 114: "the own lock of the posted event %p is busy", ev);
! 115: ngx_unlock(ev->lock);
! 116: ev = ev->next;
! 117: continue;
! 118: }
! 119: *(ev->own_lock) = 1;
! 120: }
! 121:
! 122: ngx_delete_posted_event(ev);
! 123:
! 124: ev->locked = 1;
! 125:
! 126: ev->ready |= ev->posted_ready;
! 127: ev->timedout |= ev->posted_timedout;
! 128: ev->pending_eof |= ev->posted_eof;
! 129: #if (NGX_HAVE_KQUEUE)
! 130: ev->kq_errno |= ev->posted_errno;
! 131: #endif
! 132: if (ev->posted_available) {
! 133: ev->available = ev->posted_available;
! 134: }
! 135:
! 136: ev->posted_ready = 0;
! 137: ev->posted_timedout = 0;
! 138: ev->posted_eof = 0;
! 139: #if (NGX_HAVE_KQUEUE)
! 140: ev->posted_errno = 0;
! 141: #endif
! 142: ev->posted_available = 0;
! 143:
! 144: ngx_mutex_unlock(ngx_posted_events_mutex);
! 145:
! 146: ev->handler(ev);
! 147:
! 148: ngx_mutex_lock(ngx_posted_events_mutex);
! 149:
! 150: if (ev->locked) {
! 151: ngx_unlock(ev->lock);
! 152:
! 153: if (ev->lock != ev->own_lock) {
! 154: ngx_unlock(ev->own_lock);
! 155: }
! 156: }
! 157:
! 158: ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
! 159: "posted event %p is done", ev);
! 160:
! 161: break;
! 162: }
! 163: }
! 164: }
! 165:
! 166: #else
! 167:
! 168: void
! 169: ngx_wakeup_worker_thread(ngx_cycle_t *cycle)
! 170: {
! 171: }
! 172:
! 173: #endif
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>