changeset 355:0fb6c53fb135

nginx-0.0.7-2004-06-15-21:47:16 import
author Igor Sysoev <igor@sysoev.ru>
date Tue, 15 Jun 2004 17:47:16 +0000
parents eaf1f651cf86
children 2e3cbc1bbe3c
files auto/func auto/os/conf auto/os/freebsd auto/os/linux auto/sources auto/unix src/core/ngx_config.h src/event/modules/ngx_select_module.c src/event/ngx_event.c src/http/modules/ngx_http_gzip_filter.c src/os/unix/ngx_freebsd_config.h src/os/unix/ngx_linux_config.h src/os/unix/ngx_posix_config.h src/os/unix/ngx_posix_init.c src/os/unix/ngx_process.c src/os/unix/ngx_process.h src/os/unix/ngx_process_cycle.c src/os/unix/ngx_solaris_config.h
diffstat 18 files changed, 197 insertions(+), 93 deletions(-) [+]
line wrap: on
line diff
--- a/auto/func
+++ b/auto/func
@@ -5,10 +5,11 @@ echo "checking for $ngx_func" >> $NGX_ER
 
 ngx_found=no
 
-func=`echo $ngx_func | sed -e 's/()$//' | tr '[a-z]' '[A-Z]'`
+func=`echo $ngx_func | sed -e 's/()$//' | tr '[a-z.]' '[A-Z_]'`
 
 cat << END > $NGX_AUTOTEST.c
 
+#include <sys/types.h>
 $NGX_UNISTD_H
 $ngx_func_inc
 
--- a/auto/os/conf
+++ b/auto/os/conf
@@ -45,4 +45,10 @@ case $PLATFORM in
         CORE_LIBS="$CORE_LIBS ws2_32.lib"
     ;;
 
+    *)
+        CORE_INCS="$UNIX_INCS"
+        CORE_DEPS="$UNIX_DEPS $POSIX_DEPS"
+        CORE_SRCS="$UNIX_SRCS"
+    ;;
+
 esac
--- a/auto/os/freebsd
+++ b/auto/os/freebsd
@@ -66,6 +66,3 @@ if [ $EVENT_AIO = YES ]; then
 else
     have=HAVE_AIO . auto/nohave
 fi
-
-
-have=HAVE_MSGHDR_MSG_CONTROL . auto/have
--- a/auto/os/linux
+++ b/auto/os/linux
@@ -77,6 +77,3 @@ ngx_func_test="prctl(PR_SET_DUMPABLE, 1,
 if [ $ngx_found = yes ]; then
     have=HAVE_PR_SET_DUMPABLE . auto/have
 fi
-
-
-have=HAVE_MSGHDR_MSG_CONTROL . auto/have
--- a/auto/sources
+++ b/auto/sources
@@ -125,6 +125,8 @@ UNIX_SRCS="$CORE_SRCS $EVENT_SRCS \
             src/os/unix/ngx_posix_init.c \
             src/os/unix/ngx_process_cycle.c"
 
+POSIX_DEPS=src/os/unix/ngx_posix_config.h
+
 FREEBSD_DEPS=src/os/unix/ngx_freebsd_config.h
 FREEBSD_SRCS=src/os/unix/ngx_freebsd_init.c
 FREEBSD_SENDFILE_SRCS=src/os/unix/ngx_freebsd_sendfile_chain.c
--- a/auto/unix
+++ b/auto/unix
@@ -41,8 +41,7 @@ ngx_types="int"; . auto/types/typedef
 
 
 ngx_func="sin_len"
-ngx_func_inc="#include <sys/types.h>
-#include <sys/socket.h>
+ngx_func_inc="#include <sys/socket.h>
 #include <netinet/in.h>"
 
 ngx_func_test="struct sockaddr_in sa; sa.sin_len = 5"
@@ -122,3 +121,15 @@ ngx_func="memalign()"
 ngx_func_inc="#include <stdlib.h>"
 ngx_func_test="void *p; p = memalign(4096, 4096)"
 . auto/func
+
+
+ngx_func="msghdr.msg_control"
+ngx_func_inc="#include <sys/socket.h>"
+ngx_func_test="struct msghdr  msg; msg.msg_control = NULL"
+. auto/func
+
+
+ngx_func="FIONBIO"
+ngx_func_inc="#include <sys/filio.h>"
+ngx_func_test="int i; i = FIONBIO"
+. auto/func
--- a/src/core/ngx_config.h
+++ b/src/core/ngx_config.h
@@ -22,17 +22,11 @@
 
 
 #elif defined _WIN32
-
-/* STUB to allocate a big ngx_connections */
-#undef  FD_SETSIZE
-#define FD_SETSIZE  1024
-
 #include <ngx_win32_config.h>
 
 
 #else /* posix */
-
-#include <ngx_auto_config.h>
+#include <ngx_posix_config.h>
 
 #endif
 
--- a/src/event/modules/ngx_select_module.c
+++ b/src/event/modules/ngx_select_module.c
@@ -596,12 +596,14 @@ static char *ngx_select_init_conf(ngx_cy
 
     /* disable warning: the default FD_SETSIZE is 1024U in FreeBSD 5.x */
 
+#if !(WIN32)
     if ((unsigned) ecf->connections > FD_SETSIZE) {
         ngx_log_error(NGX_LOG_EMERG, cycle->log, 0,
                       "the maximum number of files "
                       "supported by select() is " ngx_value(FD_SETSIZE));
         return NGX_CONF_ERROR;
     }
+#endif
 
     return NGX_CONF_OK;
 }
--- a/src/event/ngx_event.c
+++ b/src/event/ngx_event.c
@@ -658,8 +658,12 @@ static char *ngx_event_init_conf(ngx_cyc
 
 #elif (HAVE_SELECT)
 
+#if (WIN32)
+    ngx_conf_init_unsigned_value(ecf->connections, DEFAULT_CONNECTIONS);
+#else
     ngx_conf_init_unsigned_value(ecf->connections,
           FD_SETSIZE < DEFAULT_CONNECTIONS ? FD_SETSIZE : DEFAULT_CONNECTIONS);
+#endif
 
     ngx_conf_init_value(ecf->use, ngx_select_module.ctx_index);
     ngx_conf_init_ptr_value(ecf->name, ngx_select_module_ctx.name->data);
--- a/src/http/modules/ngx_http_gzip_filter.c
+++ b/src/http/modules/ngx_http_gzip_filter.c
@@ -668,7 +668,15 @@ static int ngx_http_gzip_body_filter(ngx
                 trailer->crc32 = ctx->crc32;
                 trailer->zlen = ctx->zin;
 #else
-                /* STUB */ Oops !
+                trailer->crc32[0] = ctx->crc32 & 0xff;
+                trailer->crc32[1] = (ctx->crc32 >> 8) & 0xff;
+                trailer->crc32[2] = (ctx->crc32 >> 16) & 0xff;
+                trailer->crc32[3] = (ctx->crc32 >> 24) & 0xff;
+
+                trailer->zlen[0] = ctx->zin & 0xff;
+                trailer->zlen[1] = (ctx->zin >> 8) & 0xff;
+                trailer->zlen[2] = (ctx->zin >> 16) & 0xff;
+                trailer->zlen[3] = (ctx->zin >> 24) & 0xff;
 #endif
 
                 ctx->zstream.avail_in = 0;
--- a/src/os/unix/ngx_freebsd_config.h
+++ b/src/os/unix/ngx_freebsd_config.h
@@ -2,35 +2,38 @@
 #define _NGX_FREEBSD_CONFIG_H_INCLUDED_
 
 
+#include <sys/types.h>
+#include <sys/time.h>
 #include <unistd.h>
-#include <stddef.h>             /* offsetof() */
-#include <stdlib.h>
 #include <stdarg.h>
+#include <stddef.h>             /* offsetof() */
 #include <stdio.h>
+#include <stdlib.h>
 #include <errno.h>
-#include <fcntl.h>
 #include <string.h>
 #include <signal.h>
-#include <limits.h>
-#include <sys/types.h>
+#include <pwd.h>
+#include <grp.h>
+#include <dirent.h>
+
+#include <sys/uio.h>
+#include <sys/filio.h>          /* FIONBIO */
 #include <sys/stat.h>
-#include <sys/time.h>
-#include <sys/uio.h>
-#include <sys/ioctl.h>
-#include <sys/resource.h>
-#include <sys/sysctl.h>
+#include <fcntl.h>
+
 #include <sys/wait.h>
 #include <sys/mman.h>
+#include <sys/resource.h>
+
 #include <sys/socket.h>
 #include <netinet/in.h>
+#include <arpa/inet.h>
+#include <netdb.h>
+
+#include <libutil.h>            /* setproctitle() before 4.1 */
+#include <osreldate.h>
+#include <sys/sysctl.h>
 #include <netinet/tcp.h>        /* TCP_NOPUSH */
-#include <arpa/inet.h>
-#include <pwd.h>
-#include <grp.h>
-#include <netdb.h>
-#include <dirent.h>
-#include <libutil.h>            /* setproctitle() brefore 4.1 */
-#include <osreldate.h>
 
 #include <ngx_auto_config.h>
 
@@ -89,11 +92,6 @@ pid_t rfork_thread(int flags, void *stac
 #endif
 
 
-#ifndef HAVE_FIONBIO
-#define HAVE_FIONBIO   1
-#endif
-
-
 /* STUB: autoconf */
 #define ngx_setproctitle  setproctitle
 
--- a/src/os/unix/ngx_linux_config.h
+++ b/src/os/unix/ngx_linux_config.h
@@ -8,35 +8,43 @@
 #define _LARGEFILE_SOURCE
 
 
-#include <unistd.h>
-#include <stddef.h>             /* offsetof() */
-#include <stdlib.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <string.h>
-#include <signal.h>
-#include <limits.h>
-#include <time.h>
 #include <sys/types.h>
 #include <sys/time.h>
-#include <sys/select.h>
+#include <unistd.h>
+#include <stdarg.h>
+#include <stddef.h>             /* offsetof() */
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <string.h>
+#include <signal.h>
+#include <pwd.h>
+#include <grp.h>
+#include <dirent.h>
+
 #include <sys/uio.h>
-#include <sys/ioctl.h>
-#include <sys/resource.h>
-#include <sys/sysctl.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
 #include <sys/wait.h>
 #include <sys/mman.h>
+#include <sys/resource.h>
+
 #include <sys/socket.h>
 #include <netinet/in.h>
+#include <arpa/inet.h>
+#include <netdb.h>
+
+#include <time.h>               /* tzset() */
+#include <sys/ioctl.h>
+#include <sys/sysctl.h>
 #include <netinet/tcp.h>        /* TCP_CORK */
-#include <arpa/inet.h>
-#include <pwd.h>
-#include <grp.h>
-#include <netdb.h>
-#include <dirent.h>
+
 
+/* Linux has no <sys/filio.h> so autoconfigure does not find FIONBIO */
+#ifndef HAVE_FIONBIO
+#define HAVE_FIONBIO  1
+#endif
 
 #include <ngx_auto_config.h>
 
@@ -80,11 +88,6 @@ extern ssize_t sendfile(int s, int fd, i
 #endif
 
 
-#ifndef HAVE_FIONBIO
-#define HAVE_FIONBIO   1
-#endif
-
-
 #ifndef HAVE_SELECT_CHANGE_TIMEOUT
 #define HAVE_SELECT_CHANGE_TIMEOUT   1
 #endif
new file mode 100644
--- /dev/null
+++ b/src/os/unix/ngx_posix_config.h
@@ -0,0 +1,55 @@
+#ifndef _NGX_POSIX_CONFIG_H_INCLUDED_
+#define _NGX_POSIX_CONFIG_H_INCLUDED_
+
+
+#include <sys/types.h>
+#include <sys/time.h>
+#include <unistd.h>
+#include <stdarg.h>
+#include <stddef.h>             /* offsetof() */
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <string.h>
+#include <signal.h>
+#include <pwd.h>
+#include <grp.h>
+#include <dirent.h>
+
+#include <sys/uio.h>
+#include <sys/filio.h>          /* FIONBIO */
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#include <sys/wait.h>
+#include <sys/mman.h>
+#include <sys/resource.h>
+
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <netdb.h>
+
+#include <ngx_auto_config.h>
+
+
+#ifndef HAVE_SELECT
+#define HAVE_SELECT  1
+#endif
+
+
+#ifndef HAVE_POLL
+#define HAVE_POLL  1
+#endif
+#if (HAVE_POLL)
+#include <poll.h>
+#endif
+
+
+#define ngx_setproctitle(title)
+
+
+#define NGX_POSIX_IO  1
+
+
+#endif /* _NGX_POSIX_CONFIG_H_INCLUDED_ */
--- a/src/os/unix/ngx_posix_init.c
+++ b/src/os/unix/ngx_posix_init.c
@@ -7,6 +7,26 @@ int  ngx_max_sockets;
 int  ngx_inherited_nonblocking;
 
 
+#if (NGX_POSIX_IO)
+
+ngx_os_io_t ngx_os_io = {
+    ngx_unix_recv,
+    ngx_readv_chain,
+    NULL,
+    ngx_writev_chain,
+    0
+};
+
+
+int ngx_os_init(ngx_log_t *log)
+{
+    return ngx_posix_init(log);
+}
+
+
+#endif
+
+
 void ngx_signal_handler(int signo);
 
 
--- a/src/os/unix/ngx_process.c
+++ b/src/os/unix/ngx_process.c
@@ -6,6 +6,7 @@
 
 static void ngx_execute_proc(ngx_cycle_t *cycle, void *data);
 
+ngx_int_t      ngx_current_slot;
 ngx_int_t      ngx_last_process;
 ngx_socket_t   ngx_channel;
 ngx_process_t  ngx_processes[NGX_MAX_PROCESSES];
@@ -44,6 +45,7 @@ ngx_pid_t ngx_spawn_process(ngx_cycle_t 
     }
 
     ngx_channel = ngx_processes[s].channel[1];
+    ngx_current_slot = s;
 
 
     pid = fork();
--- a/src/os/unix/ngx_process.h
+++ b/src/os/unix/ngx_process.h
@@ -49,6 +49,7 @@ ngx_pid_t ngx_execute(ngx_cycle_t *cycle
 void ngx_process_get_status(void);
 
 extern ngx_pid_t      ngx_pid;
+extern ngx_int_t      ngx_current_slot;
 extern ngx_int_t      ngx_last_process;
 extern ngx_socket_t   ngx_channel;
 extern ngx_process_t  ngx_processes[NGX_MAX_PROCESSES];
--- a/src/os/unix/ngx_process_cycle.c
+++ b/src/os/unix/ngx_process_cycle.c
@@ -527,10 +527,16 @@ static void ngx_worker_process_cycle(ngx
         }
     }
 
-    for (n = 0; n < ngx_last_process; n++) {
+    for (n = 0; n <= ngx_last_process; n++) {
 
-        ngx_log_debug1(NGX_LOG_DEBUG_CORE, cycle->log, 0,
-                       "close channel %d", ngx_processes[n].channel[1]);
+        if (n == ngx_current_slot) {
+            if (close(ngx_processes[n].channel[0]) == -1) {
+                ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
+                              "close() failed");
+            }
+
+            continue;
+        }
 
         if (close(ngx_processes[n].channel[1]) == -1) {
             ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
@@ -538,11 +544,6 @@ static void ngx_worker_process_cycle(ngx
         }
     }
 
-    if (close(ngx_processes[ngx_last_process].channel[0]) == -1) {
-        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
-                      "close() failed");
-    }
-
 #if 0
     ngx_last_process = 0;
 #endif
@@ -737,7 +738,7 @@ ngx_int_t ngx_write_channel(ngx_socket_t
         msg.msg_controllen = 0;
 
     } else {
-        msg.msg_control = &cm;
+        msg.msg_control = (caddr_t) &cm;
         msg.msg_controllen = sizeof(struct cmsghdr) +  sizeof(int);
 
         cm.cmsg_len = sizeof(struct cmsghdr) +  sizeof(int);
@@ -802,7 +803,7 @@ ngx_int_t ngx_read_channel(ngx_socket_t 
     msg.msg_iovlen = 1;
 
 #if (HAVE_MSGHDR_MSG_CONTROL)
-    msg.msg_control = &cm;
+    msg.msg_control = (caddr_t) &cm;
     msg.msg_controllen = sizeof(struct cmsghdr) +  sizeof(int);
 #else
     msg.msg_accrights = (caddr_t) &fd;
@@ -830,7 +831,7 @@ ngx_int_t ngx_read_channel(ngx_socket_t 
 #if (HAVE_MSGHDR_MSG_CONTROL)
 
     if (ch->command == NGX_CMD_OPEN_CHANNEL) {
-        cm = msg.msg_control;
+        cm = (struct cmsghdr *) msg.msg_control;
 
         if (cm == NULL) {
             ngx_log_error(NGX_LOG_ALERT, log, 0, 
--- a/src/os/unix/ngx_solaris_config.h
+++ b/src/os/unix/ngx_solaris_config.h
@@ -6,33 +6,40 @@
 
 #define _REENTRANT
 
-#define _FILE_OFFSET_BITS  64   /* must be before sys/types.h */
+#define _FILE_OFFSET_BITS  64   /* must be before <sys/types.h> */
 
+#include <sys/types.h>
+#include <sys/time.h>
 #include <unistd.h>
-#include <inttypes.h>
+#include <stdarg.h>
 #include <stddef.h>             /* offsetof() */
+#include <stdio.h>
 #include <stdlib.h>
-#include <stdarg.h>
-#include <stdio.h>
 #include <errno.h>
-#include <fcntl.h>
 #include <string.h>
 #include <signal.h>
-#include <limits.h>
-#include <sys/types.h>
+#include <pwd.h>
+#include <grp.h>
+#include <dirent.h>
+
+#include <sys/uio.h>
+#include <sys/filio.h>          /* FIONBIO */
 #include <sys/stat.h>
+#include <fcntl.h>
+
 #include <sys/wait.h>
 #include <sys/mman.h>
+#include <sys/resource.h>
+
 #include <sys/socket.h>
-#include <sys/sendfile.h>
-#include <sys/filio.h>          /* FIONBIO */
-#include <sys/systeminfo.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
-#include <pwd.h>
-#include <grp.h>
 #include <netdb.h>
-#include <dirent.h>
+
+#include <sys/sendfile.h>
+#include <sys/systeminfo.h>
+#include <limits.h>             /* IOV_MAX */
+#include <inttypes.h>
 
 #include <ngx_auto_config.h>
 
@@ -66,11 +73,6 @@
 #endif
 
 
-#ifndef HAVE_FIONBIO
-#define HAVE_FIONBIO   1
-#endif
-
-
 #define ngx_setproctitle(title)