Mercurial > hg > nginx
diff src/event/modules/ngx_poll_module.c @ 250:1903c6821958
nginx-0.0.2-2004-02-03-23:27:11 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Tue, 03 Feb 2004 20:27:11 +0000 |
parents | e885208c518b |
children | c31c40540318 |
line wrap: on
line diff
--- a/src/event/modules/ngx_poll_module.c +++ b/src/event/modules/ngx_poll_module.c @@ -130,6 +130,12 @@ static int ngx_poll_add_event(ngx_event_ c = ev->data; + if (ev->index != NGX_INVALID_INDEX) { + ngx_log_error(NGX_LOG_ALERT, ev->log, 0, + "poll event fd:%d ev:%d is already set", c->fd, event); + return NGX_OK; + } + ev->active = 1; ev->oneshot = (flags & NGX_ONESHOT_EVENT) ? 1 : 0; @@ -159,6 +165,9 @@ static int ngx_poll_add_event(ngx_event_ nevents++; } else { + ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ev->log, 0, + "poll index: %d", e->index); + event_list[e->index].events |= event; ev->index = e->index; } @@ -195,13 +204,18 @@ static int ngx_poll_del_event(ngx_event_ "poll del event: fd:%d ev:%d", c->fd, event); if (e == NULL || e->index == NGX_INVALID_INDEX) { - if (ev->index < (u_int) --nevents) { + nevents--; + + if (ev->index < (u_int) nevents) { event_list[ev->index] = event_list[nevents]; event_index[ev->index] = event_index[nevents]; event_index[ev->index]->index = ev->index; } } else { + ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ev->log, 0, + "poll index: %d", e->index); + event_list[e->index].events &= ~event; } @@ -232,8 +246,8 @@ static int ngx_poll_process_events(ngx_l #if (NGX_DEBUG) for (i = 0; i < nevents; i++) { - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, log, 0, "poll: fd:%d ev:%04X", - event_list[i].fd, event_list[i].events); + ngx_log_debug3(NGX_LOG_DEBUG_EVENT, log, 0, "poll: %d: fd:%d ev:%04X", + i, event_list[i].fd, event_list[i].events); } ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0, "poll timer: %d", timer); @@ -278,9 +292,9 @@ static int ngx_poll_process_events(ngx_l for (i = 0; i < nevents && ready; i++) { - ngx_log_debug3(NGX_LOG_DEBUG_EVENT, log, 0, - "poll: fd:%d ev:%04X rev:%04X", - event_list[i].fd, + ngx_log_debug4(NGX_LOG_DEBUG_EVENT, log, 0, + "poll: %d: fd:%d ev:%04X rev:%04X", + i, event_list[i].fd, event_list[i].events, event_list[i].revents); if (event_list[i].revents & (POLLERR|POLLHUP|POLLNVAL)) { @@ -315,6 +329,18 @@ static int ngx_poll_process_events(ngx_l if (c->fd == -1) { ngx_log_error(NGX_LOG_ALERT, log, 0, "unknown cycle"); + + /* + * it is certainly our fault and it should be investigated, + * in the meantime we disable this event to avoid a CPU spinning + */ + + if (i == nevents - 1) { + nevents--; + } else { + event_list[i].fd = -1; + } + continue; }