3 * Copyright (C) Igor Sysoev
7 #include <ngx_config.h>
12 ngx_thread_volatile ngx_event_t *ngx_posted_accept_events;
13 ngx_thread_volatile ngx_event_t *ngx_posted_events;
16 ngx_mutex_t *ngx_posted_events_mutex;
21 ngx_event_process_posted(ngx_cycle_t *cycle,
22 ngx_thread_volatile ngx_event_t **posted)
28 ev = (ngx_event_t *) *posted;
30 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
31 "posted event %p", ev);
37 ngx_delete_posted_event(ev);
44 #if (NGX_THREADS) && !(NGX_WIN32)
47 ngx_wakeup_worker_thread(ngx_cycle_t *cycle)
56 if (ngx_mutex_lock(ngx_posted_events_mutex) == NGX_ERROR) {
60 for (ev = (ngx_event_t *) ngx_posted_events; ev; ev = ev->next) {
61 if (*(ev->lock) == 0) {
67 ngx_mutex_unlock(ngx_posted_events_mutex);
74 for (i = 0; i < ngx_threads_n; i++) {
75 if (ngx_threads[i].state == NGX_THREAD_FREE) {
76 ngx_cond_signal(ngx_threads[i].cv);
84 ngx_event_thread_process_posted(ngx_cycle_t *cycle)
90 ev = (ngx_event_t *) ngx_posted_events;
94 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
95 "posted event %p", ev);
101 if (ngx_trylock(ev->lock) == 0) {
103 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
104 "posted event %p is busy", ev);
110 if (ev->lock != ev->own_lock) {
111 if (*(ev->own_lock)) {
112 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
113 "the own lock of the posted event %p is busy", ev);
114 ngx_unlock(ev->lock);
121 ngx_delete_posted_event(ev);
125 ev->ready |= ev->posted_ready;
126 ev->timedout |= ev->posted_timedout;
127 ev->pending_eof |= ev->posted_eof;
128 #if (NGX_HAVE_KQUEUE)
129 ev->kq_errno |= ev->posted_errno;
131 if (ev->posted_available) {
132 ev->available = ev->posted_available;
135 ev->posted_ready = 0;
136 ev->posted_timedout = 0;
138 #if (NGX_HAVE_KQUEUE)
139 ev->posted_errno = 0;
141 ev->posted_available = 0;
143 ngx_mutex_unlock(ngx_posted_events_mutex);
147 ngx_mutex_lock(ngx_posted_events_mutex);
150 ngx_unlock(ev->lock);
152 if (ev->lock != ev->own_lock) {
153 ngx_unlock(ev->own_lock);
157 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
158 "posted event %p is done", ev);
168 ngx_wakeup_worker_thread(ngx_cycle_t *cycle)