Mercurial > hg > nginx
comparison src/event/modules/ngx_poll_module.c @ 252:84b1c672ec5a
nginx-0.0.2-2004-02-05-19:58:36 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Thu, 05 Feb 2004 16:58:36 +0000 |
parents | c31c40540318 |
children | b6793bc5034b |
comparison
equal
deleted
inserted
replaced
251:c31c40540318 | 252:84b1c672ec5a |
---|---|
17 | 17 |
18 | 18 |
19 static struct pollfd *event_list; | 19 static struct pollfd *event_list; |
20 static int nevents; | 20 static int nevents; |
21 | 21 |
22 static ngx_event_t **event_index; | |
23 static ngx_event_t **ready_index; | 22 static ngx_event_t **ready_index; |
24 | 23 |
25 | 24 |
26 static ngx_str_t poll_name = ngx_string("poll"); | 25 static ngx_str_t poll_name = ngx_string("poll"); |
27 | 26 |
56 | 55 |
57 | 56 |
58 static int ngx_poll_init(ngx_cycle_t *cycle) | 57 static int ngx_poll_init(ngx_cycle_t *cycle) |
59 { | 58 { |
60 struct pollfd *list; | 59 struct pollfd *list; |
61 ngx_event_t **index; | |
62 | 60 |
63 if (event_list == NULL) { | 61 if (event_list == NULL) { |
64 nevents = 0; | 62 nevents = 0; |
65 } | 63 } |
66 | 64 |
77 ngx_free(event_list); | 75 ngx_free(event_list); |
78 } | 76 } |
79 | 77 |
80 event_list = list; | 78 event_list = list; |
81 | 79 |
82 ngx_test_null(index, | |
83 ngx_alloc(sizeof(ngx_event_t *) * cycle->connection_n, | |
84 cycle->log), | |
85 NGX_ERROR); | |
86 | |
87 if (event_index) { | |
88 ngx_memcpy(index, event_index, sizeof(ngx_event_t *) * nevents); | |
89 ngx_free(event_index); | |
90 } | |
91 | |
92 event_index = index; | |
93 | |
94 if (ready_index) { | 80 if (ready_index) { |
95 ngx_free(ready_index); | 81 ngx_free(ready_index); |
96 } | 82 } |
97 | 83 |
98 ngx_test_null(ready_index, | 84 ngx_test_null(ready_index, |
112 | 98 |
113 | 99 |
114 static void ngx_poll_done(ngx_cycle_t *cycle) | 100 static void ngx_poll_done(ngx_cycle_t *cycle) |
115 { | 101 { |
116 ngx_free(event_list); | 102 ngx_free(event_list); |
117 ngx_free(event_index); | |
118 ngx_free(ready_index); | 103 ngx_free(ready_index); |
119 | 104 |
120 event_list = NULL; | 105 event_list = NULL; |
121 event_index = NULL; | |
122 ready_index = NULL; | 106 ready_index = NULL; |
123 } | 107 } |
124 | 108 |
125 | 109 |
126 static int ngx_poll_add_event(ngx_event_t *ev, int event, u_int flags) | 110 static int ngx_poll_add_event(ngx_event_t *ev, int event, u_int flags) |
134 ngx_log_error(NGX_LOG_ALERT, ev->log, 0, | 118 ngx_log_error(NGX_LOG_ALERT, ev->log, 0, |
135 "poll event fd:%d ev:%d is already set", c->fd, event); | 119 "poll event fd:%d ev:%d is already set", c->fd, event); |
136 return NGX_OK; | 120 return NGX_OK; |
137 } | 121 } |
138 | 122 |
139 ev->active = 1; | |
140 ev->oneshot = (flags & NGX_ONESHOT_EVENT) ? 1 : 0; | |
141 | |
142 if (event == NGX_READ_EVENT) { | 123 if (event == NGX_READ_EVENT) { |
143 e = c->write; | 124 e = c->write; |
144 #if (NGX_READ_EVENT != POLLIN) | 125 #if (NGX_READ_EVENT != POLLIN) |
145 event = POLLIN; | 126 event = POLLIN; |
146 #endif | 127 #endif |
158 if (e == NULL || e->index == NGX_INVALID_INDEX) { | 139 if (e == NULL || e->index == NGX_INVALID_INDEX) { |
159 event_list[nevents].fd = c->fd; | 140 event_list[nevents].fd = c->fd; |
160 event_list[nevents].events = event; | 141 event_list[nevents].events = event; |
161 event_list[nevents].revents = 0; | 142 event_list[nevents].revents = 0; |
162 | 143 |
163 event_index[nevents] = ev; | |
164 ev->index = nevents; | 144 ev->index = nevents; |
165 nevents++; | 145 nevents++; |
166 | 146 |
167 } else { | 147 } else { |
168 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ev->log, 0, | 148 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ev->log, 0, |
170 | 150 |
171 event_list[e->index].events |= event; | 151 event_list[e->index].events |= event; |
172 ev->index = e->index; | 152 ev->index = e->index; |
173 } | 153 } |
174 | 154 |
155 ev->active = 1; | |
156 ev->oneshot = (flags & NGX_ONESHOT_EVENT) ? 1 : 0; | |
157 | |
175 return NGX_OK; | 158 return NGX_OK; |
176 } | 159 } |
177 | 160 |
178 | 161 |
179 static int ngx_poll_del_event(ngx_event_t *ev, int event, u_int flags) | 162 static int ngx_poll_del_event(ngx_event_t *ev, int event, u_int flags) |
180 { | 163 { |
181 ngx_event_t *e; | 164 ngx_int_t i; |
182 ngx_connection_t *c; | 165 ngx_cycle_t **cycle; |
183 | 166 ngx_event_t *e; |
184 c = (ngx_connection_t *) ev->data; | 167 ngx_connection_t *c; |
168 | |
169 c = ev->data; | |
185 | 170 |
186 if (ev->index == NGX_INVALID_INDEX) { | 171 if (ev->index == NGX_INVALID_INDEX) { |
172 ngx_log_error(NGX_LOG_ALERT, ev->log, 0, | |
173 "poll event fd:%d ev:%d is already deleted", | |
174 c->fd, event); | |
187 return NGX_OK; | 175 return NGX_OK; |
188 } | 176 } |
189 | 177 |
190 if (event == NGX_READ_EVENT) { | 178 if (event == NGX_READ_EVENT) { |
191 e = c->write; | 179 e = c->write; |
206 if (e == NULL || e->index == NGX_INVALID_INDEX) { | 194 if (e == NULL || e->index == NGX_INVALID_INDEX) { |
207 nevents--; | 195 nevents--; |
208 | 196 |
209 if (ev->index < (u_int) nevents) { | 197 if (ev->index < (u_int) nevents) { |
210 event_list[ev->index] = event_list[nevents]; | 198 event_list[ev->index] = event_list[nevents]; |
211 event_index[ev->index] = event_index[nevents]; | 199 |
212 event_index[ev->index]->index = ev->index; | 200 c = &ngx_cycle->connections[event_list[nevents].fd]; |
201 | |
202 if (c->fd == -1) { | |
203 cycle = ngx_old_cycles.elts; | |
204 for (i = 0; i < ngx_old_cycles.nelts; i++) { | |
205 if (cycle[i] == NULL) { | |
206 continue; | |
207 } | |
208 c = &cycle[i]->connections[event_list[nevents].fd]; | |
209 if (c->fd != -1) { | |
210 break; | |
211 } | |
212 } | |
213 } | |
214 | |
215 if (c->fd == -1) { | |
216 ngx_log_error(NGX_LOG_ALERT, ev->log, 0, | |
217 "unexpected last event"); | |
218 | |
219 } else { | |
220 if (c->read->index == (u_int) nevents) { | |
221 c->read->index = ev->index; | |
222 | |
223 } else if (c->write->index == (u_int) nevents) { | |
224 c->write->index = ev->index; | |
225 | |
226 } else { | |
227 ngx_log_error(NGX_LOG_ALERT, ev->log, 0, | |
228 "unexpected last event index"); | |
229 } | |
230 } | |
213 } | 231 } |
214 | 232 |
215 } else { | 233 } else { |
216 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ev->log, 0, | 234 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ev->log, 0, |
217 "poll index: %d", e->index); | 235 "poll index: %d", e->index); |
226 } | 244 } |
227 | 245 |
228 | 246 |
229 static int ngx_poll_process_events(ngx_log_t *log) | 247 static int ngx_poll_process_events(ngx_log_t *log) |
230 { | 248 { |
231 int i, j, ready, nready, found; | 249 int ready; |
250 ngx_int_t i, j, nready, found; | |
232 ngx_msec_t timer; | 251 ngx_msec_t timer; |
233 ngx_err_t err; | 252 ngx_err_t err; |
234 ngx_cycle_t **cycle; | 253 ngx_cycle_t **cycle; |
235 ngx_event_t *ev; | 254 ngx_event_t *ev; |
236 ngx_epoch_msec_t delta; | 255 ngx_epoch_msec_t delta; |
242 | 261 |
243 if (timer == 0) { | 262 if (timer == 0) { |
244 timer = (ngx_msec_t) INFTIM; | 263 timer = (ngx_msec_t) INFTIM; |
245 } | 264 } |
246 | 265 |
247 #if (NGX_DEBUG) | 266 #if (NGX_DEBUG0) |
248 for (i = 0; i < nevents; i++) { | 267 for (i = 0; i < nevents; i++) { |
249 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, log, 0, "poll: %d: fd:%d ev:%04X", | 268 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, log, 0, "poll: %d: fd:%d ev:%04X", |
250 i, event_list[i].fd, event_list[i].events); | 269 i, event_list[i].fd, event_list[i].events); |
251 } | 270 } |
252 | 271 |
290 | 309 |
291 nready = 0; | 310 nready = 0; |
292 | 311 |
293 for (i = 0; i < nevents && ready; i++) { | 312 for (i = 0; i < nevents && ready; i++) { |
294 | 313 |
314 #if 0 | |
295 ngx_log_debug4(NGX_LOG_DEBUG_EVENT, log, 0, | 315 ngx_log_debug4(NGX_LOG_DEBUG_EVENT, log, 0, |
296 "poll: %d: fd:%d ev:%04X rev:%04X", | 316 "poll: %d: fd:%d ev:%04X rev:%04X", |
297 i, event_list[i].fd, | 317 i, event_list[i].fd, |
298 event_list[i].events, event_list[i].revents); | 318 event_list[i].events, event_list[i].revents); |
319 #else | |
320 if (event_list[i].revents) { | |
321 ngx_log_debug4(NGX_LOG_DEBUG_EVENT, log, 0, | |
322 "poll: %d: fd:%d ev:%04X rev:%04X", | |
323 i, event_list[i].fd, | |
324 event_list[i].events, event_list[i].revents); | |
325 } | |
326 #endif | |
299 | 327 |
300 if (event_list[i].revents & (POLLERR|POLLHUP|POLLNVAL)) { | 328 if (event_list[i].revents & (POLLERR|POLLHUP|POLLNVAL)) { |
301 ngx_log_error(NGX_LOG_ALERT, log, 0, | 329 ngx_log_error(NGX_LOG_ALERT, log, 0, |
302 "poll() error fd:%d ev:%04X rev:%04X", | 330 "poll() error fd:%d ev:%04X rev:%04X", |
303 event_list[i].fd, | 331 event_list[i].fd, |
333 } | 361 } |
334 } | 362 } |
335 } | 363 } |
336 | 364 |
337 if (c->fd == -1) { | 365 if (c->fd == -1) { |
338 ngx_log_error(NGX_LOG_ALERT, log, 0, "unknown cycle"); | 366 ngx_log_error(NGX_LOG_ALERT, log, 0, "unexpected event"); |
339 | 367 |
340 /* | 368 /* |
341 * it is certainly our fault and it should be investigated, | 369 * it is certainly our fault and it should be investigated, |
342 * in the meantime we disable this event to avoid a CPU spinning | 370 * in the meantime we disable this event to avoid a CPU spinning |
343 */ | 371 */ |