changeset 2813:c00763aa5e1b

divide select module into two modules: Unix and Win32 ones
author Igor Sysoev <igor@sysoev.ru>
date Wed, 06 May 2009 14:53:54 +0000
parents dcb1b4d6ff54
children 219aa0b0fd58
files auto/os/win32 auto/sources src/event/modules/ngx_select_module.c src/event/modules/ngx_win32_select_module.c
diffstat 4 files changed, 6 insertions(+), 311 deletions(-) [+]
line wrap: on
line diff
--- 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
--- 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
--- a/src/event/modules/ngx_select_module.c
+++ b/src/event/modules/ngx_select_module.c
@@ -9,7 +9,6 @@
 #include <ngx_event.h>
 
 
-
 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");
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 <ngx_event.h>
 
 
-
 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
 }