# HG changeset patch # User Igor Sysoev # Date 1241621634 0 # Node ID c00763aa5e1b214db18f8be5866a729fd8b3ced2 # Parent dcb1b4d6ff540f15154dc37ff05e897859322d26 divide select module into two modules: Unix and Win32 ones diff --git a/auto/os/win32 b/auto/os/win32 --- a/auto/os/win32 +++ b/auto/os/win32 @@ -10,6 +10,7 @@ CORE_SRCS="$WIN32_SRCS $IOCP_SRCS" OS_CONFIG="$WIN32_CONFIG" CORE_LIBS="$CORE_LIBS advapi32.lib ws2_32.lib" NGX_ICONS="$NGX_WIN32_ICONS" +SELECT_SRCS=$WIN32_SELECT_SRCS EVENT_MODULES="$EVENT_MODULES $IOCP_MODULE" EVENT_FOUND=YES diff --git a/auto/sources b/auto/sources --- a/auto/sources +++ b/auto/sources @@ -95,6 +95,7 @@ EVENT_SRCS="src/event/ngx_event.c \ SELECT_MODULE=ngx_select_module SELECT_SRCS=src/event/modules/ngx_select_module.c +WIN32_SELECT_SRCS=src/event/modules/ngx_win32_select_module.c POLL_MODULE=ngx_poll_module POLL_SRCS=src/event/modules/ngx_poll_module.c diff --git a/src/event/modules/ngx_select_module.c b/src/event/modules/ngx_select_module.c --- a/src/event/modules/ngx_select_module.c +++ b/src/event/modules/ngx_select_module.c @@ -9,7 +9,6 @@ #include - static ngx_int_t ngx_select_init(ngx_cycle_t *cycle, ngx_msec_t timer); static void ngx_select_done(ngx_cycle_t *cycle); static ngx_int_t ngx_select_add_event(ngx_event_t *ev, ngx_int_t event, @@ -27,13 +26,7 @@ static fd_set master_write_fd_se static fd_set work_read_fd_set; static fd_set work_write_fd_set; -#if (NGX_WIN32) -static ngx_uint_t max_read; -static ngx_uint_t max_write; -#else static ngx_int_t max_fd; -#endif - static ngx_uint_t nevents; static ngx_event_t **event_index; @@ -112,11 +105,7 @@ ngx_select_init(ngx_cycle_t *cycle, ngx_ ngx_event_flags = NGX_USE_LEVEL_EVENT; -#if (NGX_WIN32) - max_read = max_write = 0; -#else max_fd = -1; -#endif return NGX_OK; } @@ -156,29 +145,6 @@ ngx_select_add_event(ngx_event_t *ev, ng return NGX_ERROR; } - -#if (NGX_WIN32) - - if ((event == NGX_READ_EVENT) && (max_read >= FD_SETSIZE) - || (event == NGX_WRITE_EVENT) && (max_write >= FD_SETSIZE)) - { - ngx_log_error(NGX_LOG_ERR, ev->log, 0, - "maximum number of descriptors " - "supported by select() is %d", FD_SETSIZE); - return NGX_ERROR; - } - - if (event == NGX_READ_EVENT) { - FD_SET(c->fd, &master_read_fd_set); - max_read++; - - } else if (event == NGX_WRITE_EVENT) { - FD_SET(c->fd, &master_write_fd_set); - max_write++; - } - -#else - if (event == NGX_READ_EVENT) { FD_SET(c->fd, &master_read_fd_set); @@ -190,8 +156,6 @@ ngx_select_add_event(ngx_event_t *ev, ng max_fd = c->fd; } -#endif - ev->active = 1; event_index[nevents] = ev; @@ -219,19 +183,6 @@ ngx_select_del_event(ngx_event_t *ev, ng ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0, "select del event fd:%d ev:%i", c->fd, event); -#if (NGX_WIN32) - - if (event == NGX_READ_EVENT) { - FD_CLR(c->fd, &master_read_fd_set); - max_read--; - - } else if (event == NGX_WRITE_EVENT) { - FD_CLR(c->fd, &master_write_fd_set); - max_write--; - } - -#else - if (event == NGX_READ_EVENT) { FD_CLR(c->fd, &master_read_fd_set); @@ -243,8 +194,6 @@ ngx_select_del_event(ngx_event_t *ev, ng max_fd = -1; } -#endif - if (ev->index < --nevents) { e = event_index[nevents]; event_index[ev->index] = e; @@ -268,8 +217,6 @@ ngx_select_process_events(ngx_cycle_t *c struct timeval tv, *tp; ngx_connection_t *c; -#if !(NGX_WIN32) - if (max_fd == -1) { for (i = 0; i < nevents; i++) { c = event_index[i]->data; @@ -282,8 +229,6 @@ ngx_select_process_events(ngx_cycle_t *c "change max_fd: %d", max_fd); } -#endif - #if (NGX_DEBUG) if (cycle->log->log_level & NGX_LOG_DEBUG_ALL) { for (i = 0; i < nevents; i++) { @@ -293,10 +238,8 @@ ngx_select_process_events(ngx_cycle_t *c "select event: fd:%d wr:%d", c->fd, ev->write); } -#if !(NGX_WIN32) ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "max_fd: %d", max_fd); -#endif } #endif @@ -315,30 +258,8 @@ ngx_select_process_events(ngx_cycle_t *c work_read_fd_set = master_read_fd_set; work_write_fd_set = master_write_fd_set; -#if (NGX_WIN32) - - if (max_read || max_write) { - ready = select(0, &work_read_fd_set, &work_write_fd_set, NULL, tp); - - } else { - - /* - * Winsock select() requires that at least one descriptor set must be - * be non-null, and any non-null descriptor set must contain at least - * one handle to a socket. Otherwise select() returns WSAEINVAL. - */ - - ngx_msleep(timer); - - ready = 0; - } - -#else - ready = select(max_fd + 1, &work_read_fd_set, &work_write_fd_set, NULL, tp); -#endif - if (ready == -1) { err = ngx_socket_errno; } else { @@ -352,20 +273,6 @@ ngx_select_process_events(ngx_cycle_t *c ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "select ready %d", ready); -#if (NGX_WIN32) - - if (err) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, err, "select() failed"); - - if (err == WSAENOTSOCK) { - ngx_select_repair_fd_sets(cycle); - } - - return NGX_ERROR; - } - -#else - if (err) { ngx_uint_t level; @@ -391,8 +298,6 @@ ngx_select_process_events(ngx_cycle_t *c return NGX_ERROR; } -#endif - if (ready == 0) { if (timer != NGX_TIMER_INFINITE) { return NGX_OK; @@ -459,41 +364,6 @@ ngx_select_repair_fd_sets(ngx_cycle_t *c ngx_err_t err; ngx_socket_t s; -#if (NGX_WIN32) - u_int i; - - for (i = 0; i < master_read_fd_set.fd_count; i++) { - - s = master_read_fd_set.fd_array[i]; - len = sizeof(int); - - if (getsockopt(s, SOL_SOCKET, SO_TYPE, (char *) &n, &len) == -1) { - err = ngx_socket_errno; - - ngx_log_error(NGX_LOG_ALERT, cycle->log, err, - "invalid descriptor #%d in read fd_set", s); - - FD_CLR(s, &master_read_fd_set); - } - } - - for (i = 0; i < master_write_fd_set.fd_count; i++) { - - s = master_write_fd_set.fd_array[i]; - len = sizeof(int); - - if (getsockopt(s, SOL_SOCKET, SO_TYPE, (char *) &n, &len) == -1) { - err = ngx_socket_errno; - - ngx_log_error(NGX_LOG_ALERT, cycle->log, err, - "invalid descriptor #%d in write fd_set", s); - - FD_CLR(s, &master_write_fd_set); - } - } - -#else - for (s = 0; s <= max_fd; s++) { if (FD_ISSET(s, &master_read_fd_set) == 0) { @@ -531,8 +401,6 @@ ngx_select_repair_fd_sets(ngx_cycle_t *c } max_fd = -1; - -#endif } @@ -549,8 +417,6 @@ ngx_select_init_conf(ngx_cycle_t *cycle, /* disable warning: the default FD_SETSIZE is 1024U in FreeBSD 5.x */ -#if !(NGX_WIN32) - if (cycle->connection_n > FD_SETSIZE) { ngx_log_error(NGX_LOG_EMERG, cycle->log, 0, "the maximum number of files " @@ -558,9 +424,7 @@ ngx_select_init_conf(ngx_cycle_t *cycle, return NGX_CONF_ERROR; } -#endif - -#if (NGX_THREADS) && !(NGX_WIN32) +#if (NGX_THREADS) ngx_log_error(NGX_LOG_EMERG, cycle->log, 0, "select() is not supported in the threaded mode"); diff --git a/src/event/modules/ngx_select_module.c b/src/event/modules/ngx_win32_select_module.c copy from src/event/modules/ngx_select_module.c copy to src/event/modules/ngx_win32_select_module.c --- a/src/event/modules/ngx_select_module.c +++ b/src/event/modules/ngx_win32_select_module.c @@ -9,7 +9,6 @@ #include - static ngx_int_t ngx_select_init(ngx_cycle_t *cycle, ngx_msec_t timer); static void ngx_select_done(ngx_cycle_t *cycle); static ngx_int_t ngx_select_add_event(ngx_event_t *ev, ngx_int_t event, @@ -27,13 +26,8 @@ static fd_set master_write_fd_se static fd_set work_read_fd_set; static fd_set work_write_fd_set; -#if (NGX_WIN32) static ngx_uint_t max_read; static ngx_uint_t max_write; -#else -static ngx_int_t max_fd; -#endif - static ngx_uint_t nevents; static ngx_event_t **event_index; @@ -112,11 +106,8 @@ ngx_select_init(ngx_cycle_t *cycle, ngx_ ngx_event_flags = NGX_USE_LEVEL_EVENT; -#if (NGX_WIN32) - max_read = max_write = 0; -#else - max_fd = -1; -#endif + max_read = 0; + max_write = 0; return NGX_OK; } @@ -156,9 +147,6 @@ ngx_select_add_event(ngx_event_t *ev, ng return NGX_ERROR; } - -#if (NGX_WIN32) - if ((event == NGX_READ_EVENT) && (max_read >= FD_SETSIZE) || (event == NGX_WRITE_EVENT) && (max_write >= FD_SETSIZE)) { @@ -177,21 +165,6 @@ ngx_select_add_event(ngx_event_t *ev, ng max_write++; } -#else - - if (event == NGX_READ_EVENT) { - FD_SET(c->fd, &master_read_fd_set); - - } else if (event == NGX_WRITE_EVENT) { - FD_SET(c->fd, &master_write_fd_set); - } - - if (max_fd != -1 && max_fd < c->fd) { - max_fd = c->fd; - } - -#endif - ev->active = 1; event_index[nevents] = ev; @@ -219,8 +192,6 @@ ngx_select_del_event(ngx_event_t *ev, ng ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0, "select del event fd:%d ev:%i", c->fd, event); -#if (NGX_WIN32) - if (event == NGX_READ_EVENT) { FD_CLR(c->fd, &master_read_fd_set); max_read--; @@ -230,21 +201,6 @@ ngx_select_del_event(ngx_event_t *ev, ng max_write--; } -#else - - if (event == NGX_READ_EVENT) { - FD_CLR(c->fd, &master_read_fd_set); - - } else if (event == NGX_WRITE_EVENT) { - FD_CLR(c->fd, &master_write_fd_set); - } - - if (max_fd == c->fd) { - max_fd = -1; - } - -#endif - if (ev->index < --nevents) { e = event_index[nevents]; event_index[ev->index] = e; @@ -268,22 +224,6 @@ ngx_select_process_events(ngx_cycle_t *c struct timeval tv, *tp; ngx_connection_t *c; -#if !(NGX_WIN32) - - if (max_fd == -1) { - for (i = 0; i < nevents; i++) { - c = event_index[i]->data; - if (max_fd < c->fd) { - max_fd = c->fd; - } - } - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "change max_fd: %d", max_fd); - } - -#endif - #if (NGX_DEBUG) if (cycle->log->log_level & NGX_LOG_DEBUG_ALL) { for (i = 0; i < nevents; i++) { @@ -292,11 +232,6 @@ ngx_select_process_events(ngx_cycle_t *c ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "select event: fd:%d wr:%d", c->fd, ev->write); } - -#if !(NGX_WIN32) - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "max_fd: %d", max_fd); -#endif } #endif @@ -315,8 +250,6 @@ ngx_select_process_events(ngx_cycle_t *c work_read_fd_set = master_read_fd_set; work_write_fd_set = master_write_fd_set; -#if (NGX_WIN32) - if (max_read || max_write) { ready = select(0, &work_read_fd_set, &work_write_fd_set, NULL, tp); @@ -333,12 +266,6 @@ ngx_select_process_events(ngx_cycle_t *c ready = 0; } -#else - - ready = select(max_fd + 1, &work_read_fd_set, &work_write_fd_set, NULL, tp); - -#endif - if (ready == -1) { err = ngx_socket_errno; } else { @@ -352,8 +279,6 @@ ngx_select_process_events(ngx_cycle_t *c ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "select ready %d", ready); -#if (NGX_WIN32) - if (err) { ngx_log_error(NGX_LOG_ALERT, cycle->log, err, "select() failed"); @@ -364,35 +289,6 @@ ngx_select_process_events(ngx_cycle_t *c return NGX_ERROR; } -#else - - if (err) { - ngx_uint_t level; - - if (err == NGX_EINTR) { - - if (ngx_event_timer_alarm) { - ngx_event_timer_alarm = 0; - return NGX_OK; - } - - level = NGX_LOG_INFO; - - } else { - level = NGX_LOG_ALERT; - } - - ngx_log_error(level, cycle->log, err, "select() failed"); - - if (err == EBADF) { - ngx_select_repair_fd_sets(cycle); - } - - return NGX_ERROR; - } - -#endif - if (ready == 0) { if (timer != NGX_TIMER_INFINITE) { return NGX_OK; @@ -455,13 +351,11 @@ static void ngx_select_repair_fd_sets(ngx_cycle_t *cycle) { int n; + u_int i; socklen_t len; ngx_err_t err; ngx_socket_t s; -#if (NGX_WIN32) - u_int i; - for (i = 0; i < master_read_fd_set.fd_count; i++) { s = master_read_fd_set.fd_array[i]; @@ -491,48 +385,6 @@ ngx_select_repair_fd_sets(ngx_cycle_t *c FD_CLR(s, &master_write_fd_set); } } - -#else - - for (s = 0; s <= max_fd; s++) { - - if (FD_ISSET(s, &master_read_fd_set) == 0) { - continue; - } - - len = sizeof(int); - - if (getsockopt(s, SOL_SOCKET, SO_TYPE, &n, &len) == -1) { - err = ngx_socket_errno; - - ngx_log_error(NGX_LOG_ALERT, cycle->log, err, - "invalid descriptor #%d in read fd_set", s); - - FD_CLR(s, &master_read_fd_set); - } - } - - for (s = 0; s <= max_fd; s++) { - - if (FD_ISSET(s, &master_write_fd_set) == 0) { - continue; - } - - len = sizeof(int); - - if (getsockopt(s, SOL_SOCKET, SO_TYPE, &n, &len) == -1) { - err = ngx_socket_errno; - - ngx_log_error(NGX_LOG_ALERT, cycle->log, err, - "invalid descriptor #%d in write fd_set", s); - - FD_CLR(s, &master_write_fd_set); - } - } - - max_fd = -1; - -#endif } @@ -547,28 +399,5 @@ ngx_select_init_conf(ngx_cycle_t *cycle, return NGX_CONF_OK; } - /* disable warning: the default FD_SETSIZE is 1024U in FreeBSD 5.x */ - -#if !(NGX_WIN32) - - if (cycle->connection_n > FD_SETSIZE) { - ngx_log_error(NGX_LOG_EMERG, cycle->log, 0, - "the maximum number of files " - "supported by select() is %ud", FD_SETSIZE); - return NGX_CONF_ERROR; - } - -#endif - -#if (NGX_THREADS) && !(NGX_WIN32) - - ngx_log_error(NGX_LOG_EMERG, cycle->log, 0, - "select() is not supported in the threaded mode"); - return NGX_CONF_ERROR; - -#else - return NGX_CONF_OK; - -#endif }