Annotation of embedaddon/nginx/src/event/ngx_event_posted.c, revision 1.1.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>