comparison src/event/modules/ngx_poll_module.c @ 305:4b1a3a4acc60

nginx-0.0.3-2004-04-02-19:13:20 import
author Igor Sysoev <igor@sysoev.ru>
date Fri, 02 Apr 2004 15:13:20 +0000
parents bdd631bf1a1c
children 98f1a8028067
comparison
equal deleted inserted replaced
304:bcbe876f4262 305:4b1a3a4acc60
11 11
12 static int ngx_poll_init(ngx_cycle_t *cycle); 12 static int ngx_poll_init(ngx_cycle_t *cycle);
13 static void ngx_poll_done(ngx_cycle_t *cycle); 13 static void ngx_poll_done(ngx_cycle_t *cycle);
14 static int ngx_poll_add_event(ngx_event_t *ev, int event, u_int flags); 14 static int ngx_poll_add_event(ngx_event_t *ev, int event, u_int flags);
15 static int ngx_poll_del_event(ngx_event_t *ev, int event, u_int flags); 15 static int ngx_poll_del_event(ngx_event_t *ev, int event, u_int flags);
16 int ngx_poll_process_events(ngx_log_t *log); 16 int ngx_poll_process_events(ngx_cycle_t *cycle);
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
47 NGX_MODULE, 47 NGX_MODULE,
48 &ngx_poll_module_ctx, /* module context */ 48 &ngx_poll_module_ctx, /* module context */
49 NULL, /* module directives */ 49 NULL, /* module directives */
50 NGX_EVENT_MODULE, /* module type */ 50 NGX_EVENT_MODULE, /* module type */
51 NULL, /* init module */ 51 NULL, /* init module */
52 NULL /* init child */ 52 NULL /* init process */
53 }; 53 };
54 54
55 55
56 56
57 static int ngx_poll_init(ngx_cycle_t *cycle) 57 static int ngx_poll_init(ngx_cycle_t *cycle)
159 } 159 }
160 160
161 161
162 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)
163 { 163 {
164 ngx_int_t i; 164 ngx_uint_t i;
165 ngx_cycle_t **cycle; 165 ngx_cycle_t **cycle;
166 ngx_event_t *e; 166 ngx_event_t *e;
167 ngx_connection_t *c; 167 ngx_connection_t *c;
168 168
169 c = ev->data; 169 c = ev->data;
243 243
244 return NGX_OK; 244 return NGX_OK;
245 } 245 }
246 246
247 247
248 int ngx_poll_process_events(ngx_log_t *log) 248 int ngx_poll_process_events(ngx_cycle_t *cycle)
249 { 249 {
250 int ready; 250 int ready;
251 ngx_int_t i, j, nready, found; 251 ngx_int_t i, nready;
252 ngx_uint_t n, found;
252 ngx_msec_t timer; 253 ngx_msec_t timer;
253 ngx_err_t err; 254 ngx_err_t err;
254 ngx_cycle_t **cycle; 255 ngx_cycle_t **old_cycle;
255 ngx_event_t *ev; 256 ngx_event_t *ev;
256 ngx_epoch_msec_t delta; 257 ngx_epoch_msec_t delta;
257 ngx_connection_t *c; 258 ngx_connection_t *c;
258 struct timeval tv; 259 struct timeval tv;
259 260
270 271
271 ngx_old_elapsed_msec = ngx_elapsed_msec; 272 ngx_old_elapsed_msec = ngx_elapsed_msec;
272 273
273 #if (NGX_DEBUG0) 274 #if (NGX_DEBUG0)
274 for (i = 0; i < nevents; i++) { 275 for (i = 0; i < nevents; i++) {
275 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, log, 0, "poll: %d: fd:%d ev:%04X", 276 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
277 "poll: %d: fd:%d ev:%04X",
276 i, event_list[i].fd, event_list[i].events); 278 i, event_list[i].fd, event_list[i].events);
277 } 279 }
278 280
279 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0, "poll timer: %d", timer); 281 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "poll timer: %d", timer);
280 #endif 282 #endif
281 283
282 ready = poll(event_list, (u_int) nevents, (int) timer); 284 ready = poll(event_list, (u_int) nevents, (int) timer);
283 285
284 if (ready == -1) { 286 if (ready == -1) {
291 ngx_time_update(tv.tv_sec); 293 ngx_time_update(tv.tv_sec);
292 294
293 delta = ngx_elapsed_msec; 295 delta = ngx_elapsed_msec;
294 ngx_elapsed_msec = tv.tv_sec * 1000 + tv.tv_usec / 1000 - ngx_start_msec; 296 ngx_elapsed_msec = tv.tv_sec * 1000 + tv.tv_usec / 1000 - ngx_start_msec;
295 297
296 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, log, 0, 298 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
297 "poll ready %d of %d", ready, nevents); 299 "poll ready %d of %d", ready, nevents);
298 300
299 if (err) { 301 if (err) {
300 ngx_log_error((err == NGX_EINTR) ? NGX_LOG_INFO : NGX_LOG_ALERT, 302 ngx_log_error((err == NGX_EINTR) ? NGX_LOG_INFO : NGX_LOG_ALERT,
301 log, err, "poll() failed"); 303 cycle->log, err, "poll() failed");
302 return NGX_ERROR; 304 return NGX_ERROR;
303 } 305 }
304 306
305 if (timer != (ngx_msec_t) INFTIM) { 307 if (timer != (ngx_msec_t) INFTIM) {
306 delta = ngx_elapsed_msec - delta; 308 delta = ngx_elapsed_msec - delta;
307 309
308 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, log, 0, 310 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
309 "poll timer: %d, delta: %d", timer, (int) delta); 311 "poll timer: %d, delta: %d", timer, (int) delta);
310 } else { 312 } else {
311 if (ready == 0) { 313 if (ready == 0) {
312 ngx_log_error(NGX_LOG_ALERT, log, 0, 314 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
313 "poll() returned no events without timeout"); 315 "poll() returned no events without timeout");
314 return NGX_ERROR; 316 return NGX_ERROR;
315 } 317 }
316 } 318 }
317 319
323 nready = 0; 325 nready = 0;
324 326
325 for (i = 0; i < nevents && ready; i++) { 327 for (i = 0; i < nevents && ready; i++) {
326 328
327 #if 0 329 #if 0
328 ngx_log_debug4(NGX_LOG_DEBUG_EVENT, log, 0, 330 ngx_log_debug4(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
329 "poll: %d: fd:%d ev:%04X rev:%04X", 331 "poll: %d: fd:%d ev:%04X rev:%04X",
330 i, event_list[i].fd, 332 i, event_list[i].fd,
331 event_list[i].events, event_list[i].revents); 333 event_list[i].events, event_list[i].revents);
332 #else 334 #else
333 if (event_list[i].revents) { 335 if (event_list[i].revents) {
334 ngx_log_debug4(NGX_LOG_DEBUG_EVENT, log, 0, 336 ngx_log_debug4(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
335 "poll: %d: fd:%d ev:%04X rev:%04X", 337 "poll: %d: fd:%d ev:%04X rev:%04X",
336 i, event_list[i].fd, 338 i, event_list[i].fd,
337 event_list[i].events, event_list[i].revents); 339 event_list[i].events, event_list[i].revents);
338 } 340 }
339 #endif 341 #endif
340 342
341 if (event_list[i].revents & (POLLERR|POLLHUP|POLLNVAL)) { 343 if (event_list[i].revents & (POLLERR|POLLHUP|POLLNVAL)) {
342 ngx_log_error(NGX_LOG_ALERT, log, 0, 344 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
343 "poll() error fd:%d ev:%04X rev:%04X", 345 "poll() error fd:%d ev:%04X rev:%04X",
344 event_list[i].fd, 346 event_list[i].fd,
345 event_list[i].events, event_list[i].revents); 347 event_list[i].events, event_list[i].revents);
346 } 348 }
347 349
348 if (event_list[i].revents & ~(POLLIN|POLLOUT|POLLERR|POLLHUP|POLLNVAL)) 350 if (event_list[i].revents & ~(POLLIN|POLLOUT|POLLERR|POLLHUP|POLLNVAL))
349 { 351 {
350 ngx_log_error(NGX_LOG_ALERT, log, 0, 352 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
351 "strange poll() events fd:%d ev:%04X rev:%04X", 353 "strange poll() events fd:%d ev:%04X rev:%04X",
352 event_list[i].fd, 354 event_list[i].fd,
353 event_list[i].events, event_list[i].revents); 355 event_list[i].events, event_list[i].revents);
354 } 356 }
355 357
361 } 363 }
362 364
363 c = &ngx_cycle->connections[event_list[i].fd]; 365 c = &ngx_cycle->connections[event_list[i].fd];
364 366
365 if (c->fd == -1) { 367 if (c->fd == -1) {
366 cycle = ngx_old_cycles.elts; 368 old_cycle = ngx_old_cycles.elts;
367 for (j = 0; j < ngx_old_cycles.nelts; j++) { 369 for (n = 0; n < ngx_old_cycles.nelts; n++) {
368 if (cycle[j] == NULL) { 370 if (old_cycle[n] == NULL) {
369 continue; 371 continue;
370 } 372 }
371 c = &cycle[j]->connections[event_list[i].fd]; 373 c = &old_cycle[n]->connections[event_list[i].fd];
372 if (c->fd != -1) { 374 if (c->fd != -1) {
373 break; 375 break;
374 } 376 }
375 } 377 }
376 } 378 }
377 379
378 if (c->fd == -1) { 380 if (c->fd == -1) {
379 ngx_log_error(NGX_LOG_ALERT, log, 0, "unexpected event"); 381 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, "unexpected event");
380 382
381 /* 383 /*
382 * it is certainly our fault and it should be investigated, 384 * it is certainly our fault and it should be investigated,
383 * in the meantime we disable this event to avoid a CPU spinning 385 * in the meantime we disable this event to avoid a CPU spinning
384 */ 386 */
433 435
434 ev->event_handler(ev); 436 ev->event_handler(ev);
435 } 437 }
436 438
437 if (ready != 0) { 439 if (ready != 0) {
438 ngx_log_error(NGX_LOG_ALERT, log, 0, "poll ready != events"); 440 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, "poll ready != events");
439 } 441 }
440 442
441 if (timer != (ngx_msec_t) INFTIM && delta) { 443 if (timer != (ngx_msec_t) INFTIM && delta) {
442 ngx_event_expire_timers((ngx_msec_t) delta); 444 ngx_event_expire_timers((ngx_msec_t) delta);
443 } 445 }