Mercurial > hg > nginx
diff src/event/modules/ngx_poll_module.c @ 313:98f1a8028067
nginx-0.0.3-2004-04-13-19:08:48 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Tue, 13 Apr 2004 15:08:48 +0000 |
parents | 4b1a3a4acc60 |
children | d71c87d11b16 |
line wrap: on
line diff
--- a/src/event/modules/ngx_poll_module.c +++ b/src/event/modules/ngx_poll_module.c @@ -19,7 +19,11 @@ int ngx_poll_process_events(ngx_cycle_t static struct pollfd *event_list; static int nevents; +#if 0 static ngx_event_t **ready_index; +#endif + +static ngx_event_t *accept_events; static ngx_str_t poll_name = ngx_string("poll"); @@ -77,6 +81,7 @@ static int ngx_poll_init(ngx_cycle_t *cy event_list = list; +#if 0 if (ready_index) { ngx_free(ready_index); } @@ -85,6 +90,7 @@ static int ngx_poll_init(ngx_cycle_t *cy ngx_alloc(sizeof(ngx_event_t *) * 2 * cycle->connection_n, cycle->log), NGX_ERROR); +#endif } ngx_io = ngx_os_io; @@ -100,10 +106,14 @@ static int ngx_poll_init(ngx_cycle_t *cy static void ngx_poll_done(ngx_cycle_t *cycle) { ngx_free(event_list); +#if 0 ngx_free(ready_index); +#endif event_list = NULL; +#if 0 ready_index = NULL; +#endif } @@ -168,6 +178,9 @@ static int ngx_poll_del_event(ngx_event_ c = ev->data; + ev->active = 0; + ev->posted = 0; + if (ev->index == NGX_INVALID_INDEX) { ngx_log_error(NGX_LOG_ALERT, ev->log, 0, "poll event fd:%d ev:%d is already deleted", @@ -238,7 +251,6 @@ static int ngx_poll_del_event(ngx_event_ event_list[e->index].events &= ~event; } - ev->active = 0; ev->index = NGX_INVALID_INDEX; return NGX_OK; @@ -249,7 +261,7 @@ int ngx_poll_process_events(ngx_cycle_t { int ready; ngx_int_t i, nready; - ngx_uint_t n, found; + ngx_uint_t n, found, lock, expire; ngx_msec_t timer; ngx_err_t err; ngx_cycle_t **old_cycle; @@ -260,12 +272,17 @@ int ngx_poll_process_events(ngx_cycle_t if (ngx_event_flags & NGX_OVERFLOW_EVENT) { timer = 0; + expire = 0; } else { timer = ngx_event_find_timer(); if (timer == 0) { timer = (ngx_msec_t) INFTIM; + expire = 0; + + } else { + expire = 1; } } @@ -277,9 +294,20 @@ int ngx_poll_process_events(ngx_cycle_t "poll: %d: fd:%d ev:%04X", i, event_list[i].fd, event_list[i].events); } +#endif + + if (ngx_accept_mutex) { + if (ngx_trylock_accept_mutex(cycle) == NGX_ERROR) { + return NGX_ERROR; + } + + if (ngx_accept_mutex_held == 0 && timer > ngx_accept_mutex_delay) { + timer = ngx_accept_mutex_delay; + expire = 0; + } + } ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "poll timer: %d", timer); -#endif ready = poll(event_list, (u_int) nevents, (int) timer); @@ -301,6 +329,7 @@ int ngx_poll_process_events(ngx_cycle_t if (err) { ngx_log_error((err == NGX_EINTR) ? NGX_LOG_INFO : NGX_LOG_ALERT, cycle->log, err, "poll() failed"); + ngx_accept_mutex_unlock(); return NGX_ERROR; } @@ -313,6 +342,7 @@ int ngx_poll_process_events(ngx_cycle_t if (ready == 0) { ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, "poll() returned no events without timeout"); + ngx_accept_mutex_unlock(); return NGX_ERROR; } } @@ -322,6 +352,12 @@ int ngx_poll_process_events(ngx_cycle_t return NGX_OK; } + if (ngx_mutex_lock(ngx_posted_events_mutex) == NGX_ERROR) { + ngx_accept_mutex_unlock(); + return NGX_ERROR; + } + + lock = 1; nready = 0; for (i = 0; i < nevents && ready; i++) { @@ -340,7 +376,7 @@ int ngx_poll_process_events(ngx_cycle_t } #endif - if (event_list[i].revents & (POLLERR|POLLHUP|POLLNVAL)) { + if (event_list[i].revents & (POLLERR|POLLNVAL)) { ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, "poll() error fd:%d ev:%04X rev:%04X", event_list[i].fd, @@ -356,9 +392,9 @@ int ngx_poll_process_events(ngx_cycle_t } if (event_list[i].fd == -1) { - - /* the disabled event, workaround for our possible bug */ - + /* + * the disabled event, a workaround for our possible bug, see below + */ continue; } @@ -398,12 +434,45 @@ int ngx_poll_process_events(ngx_cycle_t if (event_list[i].revents & (POLLIN|POLLERR|POLLHUP|POLLNVAL)) { found = 1; + + ev = c->read; + ev->ready = 1; + + if (ev->oneshot) { + if (ev->timer_set) { + ngx_del_timer(ev); + } + ngx_poll_del_event(ev, NGX_READ_EVENT, 0); + } + + if (ev->accept) { + ev->next = accept_events; + accept_events = ev; + } else { + ngx_post_event(ev); + } + +#if 0 ready_index[nready++] = c->read; +#endif } if (event_list[i].revents & (POLLOUT|POLLERR|POLLHUP|POLLNVAL)) { found = 1; + ev = c->write; + ev->ready = 1; + + if (ev->oneshot) { + if (ev->timer_set) { + ngx_del_timer(ev); + } + ngx_poll_del_event(ev, NGX_WRITE_EVENT, 0); + } + + ngx_post_event(ev); +#if 0 ready_index[nready++] = c->write; +#endif } if (found) { @@ -412,6 +481,7 @@ int ngx_poll_process_events(ngx_cycle_t } } +#if 0 for (i = 0; i < nready; i++) { ev = ready_index[i]; @@ -435,14 +505,55 @@ int ngx_poll_process_events(ngx_cycle_t ev->event_handler(ev); } +#endif + + ev = accept_events; + + for ( ;; ) { + + ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, + "accept event " PTR_FMT, ev); + + if (ev == NULL) { + break; + } + + ngx_mutex_unlock(ngx_posted_events_mutex); + + ev->event_handler(ev); + + ev = ev->next; + + if (ev == NULL) { + lock = 0; + break; + } + + if (ngx_mutex_lock(ngx_posted_events_mutex) == NGX_ERROR) { + ngx_accept_mutex_unlock(); + return NGX_ERROR; + } + + } + + if (lock) { + ngx_mutex_unlock(ngx_posted_events_mutex); + } + + ngx_accept_mutex_unlock(); + accept_events = NULL; if (ready != 0) { ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, "poll ready != events"); } - if (timer != (ngx_msec_t) INFTIM && delta) { + if (expire && delta) { ngx_event_expire_timers((ngx_msec_t) delta); } + if (!ngx_threaded) { + ngx_event_process_posted(cycle); + } + return nready; }