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