diff options
author | Igor Sysoev <igor@sysoev.ru> | 2004-02-03 20:27:11 +0000 |
---|---|---|
committer | Igor Sysoev <igor@sysoev.ru> | 2004-02-03 20:27:11 +0000 |
commit | af57922780f9a851d467539de58c07b2663cafd6 (patch) | |
tree | 6691dc3886be2b41140db30122b435bad0bf57d1 /src | |
parent | 25b36fedf72139617dc172dbca887888b258698d (diff) | |
download | nginx-af57922780f9a851d467539de58c07b2663cafd6.tar.gz nginx-af57922780f9a851d467539de58c07b2663cafd6.zip |
nginx-0.0.2-2004-02-03-23:27:11 import
Diffstat (limited to 'src')
-rw-r--r-- | src/event/modules/ngx_poll_module.c | 38 | ||||
-rw-r--r-- | src/event/modules/ngx_select_module.c | 8 | ||||
-rw-r--r-- | src/event/ngx_event.c | 2 |
3 files changed, 37 insertions, 11 deletions
diff --git a/src/event/modules/ngx_poll_module.c b/src/event/modules/ngx_poll_module.c index 8727c2120..8e3175a67 100644 --- 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_t *ev, int event, u_int flags) 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_t *ev, int event, u_int flags) 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_t *ev, int event, u_int flags) "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_log_t *log) #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_log_t *log) 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_log_t *log) 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; } diff --git a/src/event/modules/ngx_select_module.c b/src/event/modules/ngx_select_module.c index 602960b0d..88b150123 100644 --- a/src/event/modules/ngx_select_module.c +++ b/src/event/modules/ngx_select_module.c @@ -136,7 +136,7 @@ static int ngx_select_add_event(ngx_event_t *ev, int event, u_int flags) if (ev->index != NGX_INVALID_INDEX) { ngx_log_error(NGX_LOG_ALERT, ev->log, 0, - "%d:%d is already set", c->fd, event); + "select event fd:%d ev:%d is already set", c->fd, event); return NGX_OK; } @@ -268,7 +268,7 @@ static int ngx_select_process_events(ngx_log_t *log) #if !(WIN32) if (max_fd == -1) { for (i = 0; i < nevents; i++) { - c = (ngx_connection_t *) event_index[i]->data; + c = event_index[i]->data; if (max_fd < c->fd) { max_fd = c->fd; } @@ -282,7 +282,7 @@ static int ngx_select_process_events(ngx_log_t *log) #if (NGX_DEBUG) for (i = 0; i < nevents; i++) { ev = event_index[i]; - c = (ngx_connection_t *) ev->data; + c = ev->data; ngx_log_debug2(NGX_LOG_DEBUG_EVENT, log, 0, "select event: fd:%d wr:%d", c->fd,ev->write); } @@ -370,7 +370,7 @@ static int ngx_select_process_events(ngx_log_t *log) for (i = 0; i < nevents; i++) { ev = event_index[i]; - c = (ngx_connection_t *) ev->data; + c = ev->data; found = 0; if (ev->write) { diff --git a/src/event/ngx_event.c b/src/event/ngx_event.c index 3ca1067b4..5ef8e10c5 100644 --- a/src/event/ngx_event.c +++ b/src/event/ngx_event.c @@ -471,7 +471,7 @@ static char *ngx_event_init_conf(ngx_cycle_t *cycle, void *conf) cycle->connection_n = ecf->connections; - ngx_conf_init_value(ecf->multi_accept, 1); + ngx_conf_init_value(ecf->multi_accept, 0); return NGX_CONF_OK; } |