Mercurial > hg > nginx
diff src/event/modules/ngx_select_module.c @ 314:d71c87d11b16
nginx-0.0.3-2004-04-14-09:57:36 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Wed, 14 Apr 2004 05:57:36 +0000 |
parents | 1526e7686b20 |
children | 39b6f2df45c0 |
line wrap: on
line diff
--- a/src/event/modules/ngx_select_module.c +++ b/src/event/modules/ngx_select_module.c @@ -9,6 +9,7 @@ #include <ngx_event.h> + static int ngx_select_init(ngx_cycle_t *cycle); static void ngx_select_done(ngx_cycle_t *cycle); static int ngx_select_add_event(ngx_event_t *ev, int event, u_int flags); @@ -30,10 +31,14 @@ static int max_write; static int max_fd; #endif -static int nevents; +static ngx_uint_t nevents; static ngx_event_t **event_index; +#if 0 static ngx_event_t **ready_index; +#endif + +static ngx_event_t *accept_events; static ngx_str_t select_name = ngx_string("select"); @@ -77,7 +82,8 @@ static int ngx_select_init(ngx_cycle_t * nevents = 0; } - if (cycle->old_cycle == NULL + if (ngx_process == NGX_PROCESS_WORKER + || cycle->old_cycle == NULL || cycle->old_cycle->connection_n < cycle->connection_n) { ngx_test_null(index, @@ -91,6 +97,7 @@ static int ngx_select_init(ngx_cycle_t * } event_index = index; +#if 0 if (ready_index) { ngx_free(ready_index); } @@ -98,6 +105,7 @@ static int ngx_select_init(ngx_cycle_t * ngx_alloc(sizeof(ngx_event_t *) * 2 * cycle->connection_n, cycle->log), NGX_ERROR); +#endif } ngx_io = ngx_os_io; @@ -119,7 +127,9 @@ static int ngx_select_init(ngx_cycle_t * static void ngx_select_done(ngx_cycle_t *cycle) { ngx_free(event_index); +#if 0 ngx_free(ready_index); +#endif event_index = NULL; } @@ -192,6 +202,9 @@ static int ngx_select_del_event(ngx_even c = ev->data; + ev->active = 0; + ev->posted = 0; + if (ev->index == NGX_INVALID_INDEX) { return NGX_OK; } @@ -230,7 +243,6 @@ static int ngx_select_del_event(ngx_even event_index[ev->index]->index = ev->index; } - ev->active = 0; ev->index = NGX_INVALID_INDEX; return NGX_OK; @@ -239,15 +251,16 @@ static int ngx_select_del_event(ngx_even static int ngx_select_process_events(ngx_cycle_t *cycle) { - int i, ready, nready,found; - ngx_err_t err; - ngx_msec_t timer; - ngx_event_t *ev; - ngx_connection_t *c; - ngx_epoch_msec_t delta; - struct timeval tv, *tp; + int ready, nready; + ngx_uint_t i, found, lock, expire; + ngx_err_t err; + ngx_msec_t timer; + ngx_event_t *ev; + ngx_connection_t *c; + ngx_epoch_msec_t delta; + struct timeval tv, *tp; #if (HAVE_SELECT_CHANGE_TIMEOUT) - static ngx_epoch_msec_t deltas = 0; + static ngx_epoch_msec_t deltas = 0; #endif work_read_fd_set = master_read_fd_set; @@ -260,12 +273,24 @@ static int ngx_select_process_events(ngx tv.tv_sec = timer / 1000; tv.tv_usec = (timer % 1000) * 1000; tp = &tv; + expire = 1; } else { tp = NULL; + expire = 0; } +#if (NGX_DEBUG) + for (i = 0; i < nevents; i++) { + ev = event_index[i]; + c = ev->data; + ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0, + "select event: fd:%d wr:%d", c->fd,ev->write); + } +#endif + #if !(WIN32) + if (max_fd == -1) { for (i = 0; i < nevents; i++) { c = event_index[i]->data; @@ -277,15 +302,18 @@ static int ngx_select_process_events(ngx ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "change max_fd: %d", max_fd); } -#endif + + if (ngx_accept_mutex) { + if (ngx_trylock_accept_mutex(cycle) == NGX_ERROR) { + return NGX_ERROR; + } -#if (NGX_DEBUG) - for (i = 0; i < nevents; i++) { - ev = event_index[i]; - c = ev->data; - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "select event: fd:%d wr:%d", c->fd,ev->write); + if (ngx_accept_mutex_held == 0 && timer > ngx_accept_mutex_delay) { + timer = ngx_accept_mutex_delay; + expire = 0; + } } + #endif ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, @@ -372,6 +400,13 @@ static int ngx_select_process_events(ngx return NGX_ERROR; } + + 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; i++) { @@ -395,10 +430,36 @@ static int ngx_select_process_events(ngx } if (found) { + ev->ready = 1; + + if (ev->oneshot) { + if (ev->timer_set) { + ngx_del_timer(ev); + } + + if (ev->write) { + ngx_select_del_event(ev, NGX_WRITE_EVENT, 0); + } else { + ngx_select_del_event(ev, NGX_READ_EVENT, 0); + } + } + + if (ev->accept) { + ev->next = accept_events; + accept_events = ev; + } else { + ngx_post_event(ev); + } + + nready++; + +#if 0 ready_index[nready++] = ev; +#endif } } +#if 0 for (i = 0; i < nready; i++) { ev = ready_index[i]; ready--; @@ -423,15 +484,56 @@ static int ngx_select_process_events(ngx ev->event_handler(ev); } +#endif - if (ready != 0) { + 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 != nready) { ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, "select ready != events"); } - if (timer && delta) { + if (expire && delta) { ngx_event_expire_timers((ngx_msec_t) delta); } + if (!ngx_threaded) { + ngx_event_process_posted(cycle); + } + return NGX_OK; }