comparison src/event/modules/ngx_epoll_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 d30f2c39caae
children 6b91bfbc4123
comparison
equal deleted inserted replaced
304:bcbe876f4262 305:4b1a3a4acc60
74 static void ngx_epoll_done(ngx_cycle_t *cycle); 74 static void ngx_epoll_done(ngx_cycle_t *cycle);
75 static int ngx_epoll_add_event(ngx_event_t *ev, int event, u_int flags); 75 static int ngx_epoll_add_event(ngx_event_t *ev, int event, u_int flags);
76 static int ngx_epoll_del_event(ngx_event_t *ev, int event, u_int flags); 76 static int ngx_epoll_del_event(ngx_event_t *ev, int event, u_int flags);
77 static int ngx_epoll_add_connection(ngx_connection_t *c); 77 static int ngx_epoll_add_connection(ngx_connection_t *c);
78 static int ngx_epoll_del_connection(ngx_connection_t *c); 78 static int ngx_epoll_del_connection(ngx_connection_t *c);
79 static int ngx_epoll_process_events(ngx_log_t *log); 79 static int ngx_epoll_process_events(ngx_cycle_t *cycle);
80 80
81 static void *ngx_epoll_create_conf(ngx_cycle_t *cycle); 81 static void *ngx_epoll_create_conf(ngx_cycle_t *cycle);
82 static char *ngx_epoll_init_conf(ngx_cycle_t *cycle, void *conf); 82 static char *ngx_epoll_init_conf(ngx_cycle_t *cycle, void *conf);
83 83
84 static int ep = -1; 84 static int ep = -1;
335 return NGX_OK; 335 return NGX_OK;
336 } 336 }
337 #endif 337 #endif
338 338
339 339
340 int ngx_epoll_process_events(ngx_log_t *log) 340 int ngx_epoll_process_events(ngx_cycle_t *cycle)
341 { 341 {
342 int events; 342 int events;
343 ngx_int_t instance, i; 343 ngx_int_t instance, i;
344 size_t n; 344 size_t n;
345 ngx_msec_t timer; 345 ngx_msec_t timer;
346 ngx_err_t err; 346 ngx_err_t err;
347 ngx_cycle_t **cycle;
348 struct timeval tv; 347 struct timeval tv;
349 ngx_connection_t *c; 348 ngx_connection_t *c;
350 ngx_epoch_msec_t delta; 349 ngx_epoch_msec_t delta;
351 350
352 351
355 354
356 if (timer == 0) { 355 if (timer == 0) {
357 timer = (ngx_msec_t) -1; 356 timer = (ngx_msec_t) -1;
358 } 357 }
359 358
360 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0, "epoll timer: %d", timer); 359 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
360 "epoll timer: %d", timer);
361 361
362 events = epoll_wait(ep, event_list, nevents, timer); 362 events = epoll_wait(ep, event_list, nevents, timer);
363 363
364 if (events == -1) { 364 if (events == -1) {
365 err = ngx_errno; 365 err = ngx_errno;
374 ngx_elapsed_msec = tv.tv_sec * 1000 + tv.tv_usec / 1000 - ngx_start_msec; 374 ngx_elapsed_msec = tv.tv_sec * 1000 + tv.tv_usec / 1000 - ngx_start_msec;
375 375
376 if (timer != (ngx_msec_t) -1) { 376 if (timer != (ngx_msec_t) -1) {
377 delta = ngx_elapsed_msec - delta; 377 delta = ngx_elapsed_msec - delta;
378 378
379 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, log, 0, 379 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
380 "epoll timer: %d, delta: %d", timer, (int) delta); 380 "epoll timer: %d, delta: %d", timer, (int) delta);
381 } else { 381 } else {
382 if (events == 0) { 382 if (events == 0) {
383 ngx_log_error(NGX_LOG_ALERT, log, 0, 383 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
384 "epoll_wait() returned no events without timeout"); 384 "epoll_wait() returned no events without timeout");
385 return NGX_ERROR; 385 return NGX_ERROR;
386 } 386 }
387 } 387 }
388 388
389 if (err) { 389 if (err) {
390 ngx_log_error((err == NGX_EINTR) ? NGX_LOG_INFO : NGX_LOG_ALERT, 390 ngx_log_error((err == NGX_EINTR) ? NGX_LOG_INFO : NGX_LOG_ALERT,
391 log, err, "epoll_wait() failed"); 391 cycle->log, err, "epoll_wait() failed");
392 return NGX_ERROR; 392 return NGX_ERROR;
393 } 393 }
394 394
395 for (i = 0; i < events; i++) { 395 for (i = 0; i < events; i++) {
396 c = event_list[i].data.ptr; 396 c = event_list[i].data.ptr;
397 397
398 instance = (uintptr_t) c & 1; 398 instance = (uintptr_t) c & 1;
399 c = (ngx_connection_t *) ((uintptr_t) c & (uintptr_t) ~1); 399 c = (ngx_connection_t *) ((uintptr_t) c & (uintptr_t) ~1);
400 400
401 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, log, 0, 401 if (event_list[i].events & EPOLLIN) {
402 c->read->returned_instance = instance;
403 }
404
405 if (event_list[i].events & EPOLLOUT) {
406 c->write->returned_instance = instance;
407 }
408
409 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
402 "epoll: fd:%d ev:%04X d:" PTR_FMT, 410 "epoll: fd:%d ev:%04X d:" PTR_FMT,
403 c->fd, event_list[i].events, event_list[i].data); 411 c->fd, event_list[i].events, event_list[i].data);
404 412
405 if (c->read->instance != instance) { 413 if (c->read->instance != instance) {
406 414
407 /* 415 /*
408 * the stale event from a file descriptor 416 * the stale event from a file descriptor
409 * that was just closed in this iteration 417 * that was just closed in this iteration
410 */ 418 */
411 419
412 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0, 420 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
413 "epoll: stale event " PTR_FMT, c); 421 "epoll: stale event " PTR_FMT, c);
414 continue; 422 continue;
415 } 423 }
416 424
417 if (event_list[i].events & (EPOLLERR|EPOLLHUP)) { 425 if (event_list[i].events & (EPOLLERR|EPOLLHUP)) {
418 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, log, 0, 426 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
419 "epoll_wait() error on fd:%d ev:%04X", 427 "epoll_wait() error on fd:%d ev:%04X",
420 c->fd, event_list[i].events); 428 c->fd, event_list[i].events);
421 } 429 }
422 430
423 if (event_list[i].events & ~(EPOLLIN|EPOLLOUT|EPOLLERR|EPOLLHUP)) { 431 if (event_list[i].events & ~(EPOLLIN|EPOLLOUT|EPOLLERR|EPOLLHUP)) {
424 ngx_log_error(NGX_LOG_ALERT, log, 0, 432 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
425 "strange epoll_wait() events fd:%d ev:%04X", 433 "strange epoll_wait() events fd:%d ev:%04X",
426 c->fd, event_list[i].events); 434 c->fd, event_list[i].events);
427 } 435 }
428 436
429 if ((event_list[i].events & (EPOLLIN|EPOLLERR|EPOLLHUP)) 437 if ((event_list[i].events & (EPOLLIN|EPOLLERR|EPOLLHUP))