Mercurial > hg > nginx
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)) |