comparison src/event/modules/ngx_select_module.c @ 39:83fa61cd3d2f

nginx-0.0.1-2002-12-24-20:30:59 import
author Igor Sysoev <igor@sysoev.ru>
date Tue, 24 Dec 2002 17:30:59 +0000
parents 2ffaa35fba42
children d5d4f3bba6f0
comparison
equal deleted inserted replaced
38:2ffaa35fba42 39:83fa61cd3d2f
20 static int max_write; 20 static int max_write;
21 #else 21 #else
22 static int max_fd; 22 static int max_fd;
23 #endif 23 #endif
24 24
25 static int nevents; 25 static unsigned int nevents;
26 26
27 static ngx_event_t **event_index; 27 static ngx_event_t **event_index;
28 static ngx_event_t **ready_index; 28 static ngx_event_t **ready_index;
29 static ngx_event_t timer_queue; 29 static ngx_event_t timer_queue;
30 /* */ 30 /* */
73 return NGX_OK; 73 return NGX_OK;
74 } 74 }
75 75
76 int ngx_select_add_event(ngx_event_t *ev, int event, u_int flags) 76 int ngx_select_add_event(ngx_event_t *ev, int event, u_int flags)
77 { 77 {
78 ngx_connection_t *c; 78 ngx_connection_t *c;
79 79
80 c = (ngx_connection_t *) ev->data; 80 c = (ngx_connection_t *) ev->data;
81 81
82 #if (NGX_DEBUG_EVENT)
82 ngx_log_debug(ev->log, "select fd:%d event:%d" _ c->fd _ event); 83 ngx_log_debug(ev->log, "select fd:%d event:%d" _ c->fd _ event);
84 #endif
83 85
84 if (ev->index != NGX_INVALID_INDEX) { 86 if (ev->index != NGX_INVALID_INDEX) {
85 ngx_log_error(NGX_LOG_ALERT, ev->log, 0, 87 ngx_log_error(NGX_LOG_ALERT, ev->log, 0,
86 "%d:%d is already set", c->fd, event); 88 "%d:%d is already set", c->fd, event);
87 return NGX_OK; 89 return NGX_OK;
115 if (max_fd != -1 && max_fd < c->fd) 117 if (max_fd != -1 && max_fd < c->fd)
116 max_fd = c->fd; 118 max_fd = c->fd;
117 119
118 #endif 120 #endif
119 121
122 ev->active = 1;
120 ev->oneshot = (flags & NGX_ONESHOT_EVENT) ? 1: 0; 123 ev->oneshot = (flags & NGX_ONESHOT_EVENT) ? 1: 0;
121 124
122 event_index[nevents] = ev; 125 event_index[nevents] = ev;
123 ev->index = nevents; 126 ev->index = nevents;
124 nevents++; 127 nevents++;
132 c = (ngx_connection_t *) ev->data; 135 c = (ngx_connection_t *) ev->data;
133 136
134 if (ev->index == NGX_INVALID_INDEX) 137 if (ev->index == NGX_INVALID_INDEX)
135 return NGX_OK; 138 return NGX_OK;
136 139
140 #if (NGX_DEBUG_EVENT)
137 ngx_log_debug(c->log, "del event: %d, %d" _ c->fd _ event); 141 ngx_log_debug(c->log, "del event: %d, %d" _ c->fd _ event);
142 #endif
138 143
139 #if (WIN32) 144 #if (WIN32)
140 if (event == NGX_READ_EVENT) { 145 if (event == NGX_READ_EVENT) {
141 FD_CLR(c->fd, &master_read_fd_set); 146 FD_CLR(c->fd, &master_read_fd_set);
142 max_read--; 147 max_read--;
159 if (ev->index < --nevents) { 164 if (ev->index < --nevents) {
160 event_index[ev->index] = event_index[nevents]; 165 event_index[ev->index] = event_index[nevents];
161 event_index[ev->index]->index = ev->index; 166 event_index[ev->index]->index = ev->index;
162 } 167 }
163 168
169 ev->active = 0;
164 ev->index = NGX_INVALID_INDEX; 170 ev->index = NGX_INVALID_INDEX;
165 171
166 return NGX_OK; 172 return NGX_OK;
167 } 173 }
168 174
197 c = (ngx_connection_t *) event_index[i]->data; 203 c = (ngx_connection_t *) event_index[i]->data;
198 if (max_fd < c->fd) 204 if (max_fd < c->fd)
199 max_fd = c->fd; 205 max_fd = c->fd;
200 } 206 }
201 207
208 #if (NGX_DEBUG_EVENT)
202 ngx_log_debug(log, "change max_fd: %d" _ max_fd); 209 ngx_log_debug(log, "change max_fd: %d" _ max_fd);
203 } 210 #endif
204 #endif 211 }
205 212 #endif
206 #if 1 213
207 /* DEBUG */ 214 #if (NGX_DEBUG_EVENT)
208 for (i = 0; i < nevents; i++) { 215 for (i = 0; i < nevents; i++) {
209 ev = event_index[i]; 216 ev = event_index[i];
210 c = (ngx_connection_t *) ev->data; 217 c = (ngx_connection_t *) ev->data;
211 ngx_log_debug(log, "select: %d:%d" _ c->fd _ ev->write); 218 ngx_log_debug(log, "select: %d:%d" _ c->fd _ ev->write);
212 } 219 }
213 #endif
214 220
215 ngx_log_debug(log, "select timer: %d" _ timer); 221 ngx_log_debug(log, "select timer: %d" _ timer);
222 #endif
216 223
217 #if (WIN32) 224 #if (WIN32)
218 if ((ready = select(0, &work_read_fd_set, &work_write_fd_set, NULL, tp)) 225 if ((ready = select(0, &work_read_fd_set, &work_write_fd_set, NULL, tp))
219 #else 226 #else
220 if ((ready = select(max_fd + 1, &work_read_fd_set, &work_write_fd_set, 227 if ((ready = select(max_fd + 1, &work_read_fd_set, &work_write_fd_set,
221 NULL, tp)) 228 NULL, tp))
222 #endif 229 #endif
223 == -1) { 230 == -1)
231 {
224 ngx_log_error(NGX_LOG_ALERT, log, ngx_socket_errno, "select() failed"); 232 ngx_log_error(NGX_LOG_ALERT, log, ngx_socket_errno, "select() failed");
225 return NGX_ERROR; 233 return NGX_ERROR;
226 } 234 }
227 235
236 #if (NGX_DEBUG_EVENT)
228 ngx_log_debug(log, "select ready %d" _ ready); 237 ngx_log_debug(log, "select ready %d" _ ready);
238 #endif
229 239
230 if (timer) { 240 if (timer) {
231 delta = ngx_msec() - delta; 241 delta = ngx_msec() - delta;
232 242
233 } else { 243 } else {
234 ngx_assert((ready != 0), return NGX_ERROR, log, 244 if (ready == 0) {
235 "select() returns no events without timeout"); 245 ngx_log_error(NGX_LOG_ALERT, log, 0,
236 } 246 "select() returns no events without timeout");
237 247 return NGX_ERROR;
248 }
249 }
250
251 #if (NGX_DEBUG_EVENT)
238 ngx_log_debug(log, "select timer: %d, delta: %d" _ timer _ delta); 252 ngx_log_debug(log, "select timer: %d, delta: %d" _ timer _ delta);
239 253 #endif
240 if (timer) {
241 if (delta >= timer) {
242 for ( ;; ) {
243 ev = timer_queue.timer_next;
244
245 if (ev == &timer_queue || delta < ev->timer_delta)
246 break;
247
248 delta -= ev->timer_delta;
249 ngx_del_timer(ev);
250 ev->timedout = 1;
251 if (ev->event_handler(ev) == NGX_ERROR)
252 ev->close_handler(ev);
253 }
254
255 } else {
256 timer_queue.timer_next->timer_delta -= delta;
257 }
258 }
259 254
260 nready = 0; 255 nready = 0;
261 256
262 for (i = 0; i < nevents; i++) { 257 for (i = 0; i < nevents; i++) {
263 ev = event_index[i]; 258 ev = event_index[i];
264 c = (ngx_connection_t *) ev->data; 259 c = (ngx_connection_t *) ev->data;
265 found = 0; 260 found = 0;
266 261
267 if (ev->write) { 262 if (ev->write) {
268 if (FD_ISSET(c->fd, &work_write_fd_set)) { 263 if (FD_ISSET(c->fd, &work_write_fd_set)) {
264 found = 1;
265 #if (NGX_DEBUG_EVENT)
269 ngx_log_debug(log, "select write %d" _ c->fd); 266 ngx_log_debug(log, "select write %d" _ c->fd);
270 found = 1; 267 #endif
271 } 268 }
272 269
273 } else { 270 } else {
274 if (FD_ISSET(c->fd, &work_read_fd_set)) { 271 if (FD_ISSET(c->fd, &work_read_fd_set)) {
272 found = 1;
273 #if (NGX_DEBUG_EVENT)
275 ngx_log_debug(log, "select read %d" _ c->fd); 274 ngx_log_debug(log, "select read %d" _ c->fd);
276 found = 1; 275 #endif
277 } 276 }
278 } 277 }
279 278
280 if (found) { 279 if (found) {
281 ready_index[nready++] = ev; 280 ready_index[nready++] = ev;
282 } 281 }
283 } 282 }
284 283
285 for (i = 0; i < nready; i++) { 284 for (i = 0; i < nready; i++) {
286 ev = ready_index[i]; 285 ev = ready_index[i];
286 ready--;
287
288 if (!ev->active) {
289 continue;
290 }
287 291
288 ev->ready = 1; 292 ev->ready = 1;
289 293
290 if (ev->oneshot) { 294 if (ev->oneshot) {
291 ngx_del_timer(ev); 295 ngx_del_timer(ev);
296 ngx_select_del_event(ev, NGX_READ_EVENT, 0); 300 ngx_select_del_event(ev, NGX_READ_EVENT, 0);
297 } 301 }
298 302
299 if (ev->event_handler(ev) == NGX_ERROR) 303 if (ev->event_handler(ev) == NGX_ERROR)
300 ev->close_handler(ev); 304 ev->close_handler(ev);
301 305 }
302 ready--; 306
303 } 307 if (ready != 0) {
304 308 ngx_log_error(NGX_LOG_ALERT, log, 0, "select ready != events");
305 ngx_assert((ready == 0), /* void */ ; , log, "select ready != events"); 309 }
310
311 if (timer && timer_queue.timer_next != &timer_queue) {
312 if (delta >= timer_queue.timer_next->timer_delta) {
313 for ( ;; ) {
314 ev = timer_queue.timer_next;
315
316 if (ev == &timer_queue || delta < ev->timer_delta) {
317 break;
318 }
319
320 delta -= ev->timer_delta;
321
322 ngx_del_timer(ev);
323 ev->timedout = 1;
324 if (ev->event_handler(ev) == NGX_ERROR) {
325 ev->close_handler(ev);
326 }
327 }
328
329 } else {
330 timer_queue.timer_next->timer_delta -= delta;
331 }
332 }
306 333
307 return NGX_OK; 334 return NGX_OK;
308 } 335 }
309 336
310 void ngx_select_add_timer(ngx_event_t *ev, ngx_msec_t timer) 337 void ngx_select_add_timer(ngx_event_t *ev, ngx_msec_t timer)
311 { 338 {
312 ngx_event_t *e; 339 ngx_event_t *e;
313 340
314 #if (NGX_DEBUG) 341 #if (NGX_DEBUG_EVENT)
315 ngx_connection_t *c = (ngx_connection_t *) ev->data; 342 ngx_connection_t *c = (ngx_connection_t *) ev->data;
316 ngx_log_debug(ev->log, "set timer: %d:%d" _ c->fd _ timer); 343 ngx_log_debug(ev->log, "set timer: %d:%d" _ c->fd _ timer);
317 #endif 344 #endif
318 ngx_assert((!ev->timer_next && !ev->timer_prev), return, ev->log, 345
319 "timer already set"); 346 if (ev->timer_next || ev->timer_prev) {
347 ngx_log_error(NGX_LOG_ALERT, ev->log, 0, "timer already set");
348 return;
349 }
320 350
321 for (e = timer_queue.timer_next; 351 for (e = timer_queue.timer_next;
322 e != &timer_queue && timer > e->timer_delta; 352 e != &timer_queue && timer > e->timer_delta;
323 e = e->timer_next) 353 e = e->timer_next)
354 {
324 timer -= e->timer_delta; 355 timer -= e->timer_delta;
356 }
325 357
326 ev->timer_delta = timer; 358 ev->timer_delta = timer;
327 359
328 ev->timer_next = e; 360 ev->timer_next = e;
329 ev->timer_prev = e->timer_prev; 361 ev->timer_prev = e->timer_prev;