Hi,

enclosed you will find an amend fix as replacement to "_sb-win-multi-worker-add-3.patch" (just forgotten to save after renaming NGX_SINGLE_WORKER <-> NGX_CONF_UNSET_PTR, before it was commited).

18.06.2015 21:55, Maxim Dounin:

As I already tried to explain, the approach with inherited sockets
is basically identical to what nginx does on UNIX with fork().
There are no reasons to keep things different if you can do it
similarly on both platforms.

But it's not even roughly similar, see "win32/ngx_process.c" + "win32/ngx_process_cycle.c" in comparission to unix...
This is already at all a biggish difference to unix.

The goal is to minimize code bloat, not maximize it.

Let me think a bit, how I can make it a little smaller, or unite some code-pieces with unix.

Regards, sebres.
# HG changeset patch
# User sebres <serg.bres...@sebres.de>
# Date 1434103966 -7200
#      Fri Jun 12 12:12:46 2015 +0200
# Node ID b72d1091430e8899ee7d23c60924c100cba1c3ab
# Parent  76ee2fe9300bdcf0dbf4a05e3ed7a1136b324eb7
backwards compatibility for single worker (without inheritance of socket) + code review / amend fix

diff -r 76ee2fe9300b -r b72d1091430e src/core/ngx_connection.c
--- a/src/core/ngx_connection.c	Thu Jun 11 14:51:59 2015 +0200
+++ b/src/core/ngx_connection.c	Fri Jun 12 12:12:46 2015 +0200
@@ -427,33 +427,33 @@ ngx_open_listening_sockets(ngx_cycle_t *
             /* try to use shared sockets of master */
             if (ngx_process > NGX_PROCESS_MASTER) {
                 
-                if (!shinfo) {
-                    shinfo = ngx_get_listening_share_info(cycle, ngx_getpid());
-
-                    if (!shinfo) {
-                        failed = 1;
-                        break;
-                    }
+                if (!shinfo && ngx_get_listening_share_info(cycle, &shinfo,
+                                    ngx_getpid()) != NGX_OK) {
+                    failed = 1;
+                    break;
                 }
 
-                s = ngx_shared_socket(ls[i].sockaddr->sa_family, ls[i].type, 0,
-                    shinfo+i);
+                if (shinfo != NGX_CONF_UNSET_PTR) {
 
-                if (s == (ngx_socket_t) -1) {
-                    ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,
-                                  ngx_socket_n " for inherited socket %V failed", 
-                                  &ls[i].addr_text);
-                    return NGX_ERROR;
+                    s = ngx_shared_socket(ls[i].sockaddr->sa_family, ls[i].type, 0,
+                        shinfo+i);
+
+                    if (s == (ngx_socket_t) -1) {
+                        ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,
+                                      ngx_socket_n " for inherited socket %V failed", 
+                                      &ls[i].addr_text);
+                        return NGX_ERROR;
+                    }
+                        
+                    ngx_log_debug4(NGX_LOG_DEBUG_CORE, log, 0, "[%d] shared socket %d %V: %d",
+                        ngx_process, i, &ls[i].addr_text, s);
+
+                    ls[i].fd = s;
+
+                    ls[i].listen = 1;
+
+                    continue;
                 }
-                    
-                ngx_log_debug4(NGX_LOG_DEBUG_CORE, log, 0, "[%d] shared socket %d %V: %d",
-                    ngx_process, i, &ls[i].addr_text, s);
-
-                ls[i].fd = s;
-
-                ls[i].listen = 1;
-
-                continue;
             }
 #endif
 
diff -r 76ee2fe9300b -r b72d1091430e src/os/win32/ngx_process.c
--- a/src/os/win32/ngx_process.c	Thu Jun 11 14:51:59 2015 +0200
+++ b/src/os/win32/ngx_process.c	Fri Jun 12 12:12:46 2015 +0200
@@ -70,9 +70,7 @@ ngx_spawn_process(ngx_cycle_t *cycle, ch
         return pid;
     }
 
-#if (NGX_WIN32)
     ngx_share_listening_sockets(cycle, pid);
-#endif
 
     ngx_memzero(&ngx_processes[s], sizeof(ngx_process_t));
 
diff -r 76ee2fe9300b -r b72d1091430e src/os/win32/ngx_process_cycle.c
--- a/src/os/win32/ngx_process_cycle.c	Thu Jun 11 14:51:59 2015 +0200
+++ b/src/os/win32/ngx_process_cycle.c	Fri Jun 12 12:12:46 2015 +0200
@@ -113,11 +113,6 @@ ngx_master_process_cycle(ngx_cycle_t *cy
     events[2] = ngx_reopen_event;
     events[3] = ngx_reload_event;
 
-/* does not close listener for win32, will be shared */
-#if (!NGX_WIN32)
-    ngx_close_listening_sockets(cycle);
-#endif
-
     if (ngx_start_worker_processes(cycle, NGX_PROCESS_RESPAWN) == 0) {
         exit(2);
     }
@@ -210,11 +205,6 @@ ngx_master_process_cycle(ngx_cycle_t *cy
 
             ngx_cycle = cycle;
 
-/* does not close listener for win32, will be shared */
-#if (!NGX_WIN32)
-            ngx_close_listening_sockets(cycle);
-#endif
-
             if (ngx_start_worker_processes(cycle, NGX_PROCESS_JUST_RESPAWN)) {
                 ngx_quit_worker_processes(cycle, 1);
             }
diff -r 76ee2fe9300b -r b72d1091430e src/os/win32/ngx_socket.c
--- a/src/os/win32/ngx_socket.c	Thu Jun 11 14:51:59 2015 +0200
+++ b/src/os/win32/ngx_socket.c	Fri Jun 12 12:12:46 2015 +0200
@@ -13,6 +13,7 @@ typedef struct {
 
     ngx_pid_t      pid;
     ngx_uint_t     nelts;
+    ngx_int_t      worker_processes;
 
     /* WSAPROTOCOL_INFO * [listening.nelts] */
 
@@ -90,25 +91,30 @@ void ngx_free_listening_share(ngx_cycle_
 }
 
 
-ngx_shared_socket_info 
-ngx_get_listening_share_info(ngx_cycle_t *cycle, ngx_pid_t pid)
+ngx_int_t
+ngx_get_listening_share_info(ngx_cycle_t *cycle, ngx_shared_socket_info * pshinfo, ngx_pid_t pid)
 {
     ngx_int_t            waitint;
     ngx_int_t            waitcnt;
     ngx_shm_listener_t  *shml;
 
+    *pshinfo = NULL;
+
     if (shm_listener.addr == NULL) {
         if (ngx_get_listening_share(cycle) != NGX_OK) {
-            return NULL;
+            return NGX_ERROR;
         }
     }
-
+    shml = (ngx_shm_listener_t *)shm_listener.addr;
+        
     /* TODO: wait time and count configurable */
     waitcnt = 10;
     waitint = 5;
     do {
-    
-        shml = (ngx_shm_listener_t *)shm_listener.addr;
+        if (shml->worker_processes == 1) {
+            *pshinfo = NGX_CONF_UNSET_PTR;
+            return NGX_OK;
+        }
         if (shml->pid == pid) {
             break;
         }
@@ -124,15 +130,17 @@ ngx_get_listening_share_info(ngx_cycle_t
     if (shml->pid != pid) {
         ngx_log_error(NGX_LOG_EMERG, cycle->log, 0, 
             "wait for shared socket failed, process %d, found %d", pid, shml->pid);
-        return NULL;
+        return NGX_AGAIN;
     }
     if (cycle->listening.nelts > shml->nelts) {
         ngx_log_error(NGX_LOG_EMERG, cycle->log, 0, "unexpected shared len,"
             " expected %d, but got %d", cycle->listening.nelts, shml->nelts);
-        return NULL;
+        return NGX_ERROR;
     }
     
-    return (WSAPROTOCOL_INFO *)(shml+1);
+    *pshinfo = (WSAPROTOCOL_INFO *)(shml+1);
+
+    return NGX_OK;
 }
 
 
@@ -141,6 +149,7 @@ ngx_share_listening_sockets(ngx_cycle_t 
 {
     ngx_uint_t           i;
     ngx_listening_t     *ls;
+    ngx_core_conf_t     *ccf;
     ngx_shm_listener_t  *shml;
     WSAPROTOCOL_INFO    *protoInfo;
 
@@ -148,7 +157,11 @@ ngx_share_listening_sockets(ngx_cycle_t 
         return NGX_OK;
     }
 
-    ls = cycle->listening.elts;
+    ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);
+    if (ccf->worker_processes == 1) {
+        /* close before create shmem (to avoid free shmem) */
+        ngx_close_listening_sockets(cycle);
+    }
 
     /* create shared memory for shared listener info */
     ngx_get_listening_share(cycle);
@@ -157,30 +170,32 @@ ngx_share_listening_sockets(ngx_cycle_t 
         "[%d] share %d listener(s) for %d",
         ngx_process, cycle->listening.nelts, pid);
 
-    if (!cycle->listening.nelts)
-        return NGX_OK;
+    ls = cycle->listening.elts;
 
     /* share sockets for worker with pid */
     shml = (ngx_shm_listener_t *)shm_listener.addr;
     protoInfo = (WSAPROTOCOL_INFO *)(shml+1);
 
     shml->nelts = cycle->listening.nelts;
+    shml->worker_processes = ccf->worker_processes;
 
-    for (i = 0; i < cycle->listening.nelts; i++) {
+    if (ccf->worker_processes > 1) {
+        for (i = 0; i < cycle->listening.nelts; i++) {
 
-        if (ls[i].ignore) {
-            continue;
+            if (ls[i].ignore) {
+                continue;
+            }
+
+            ngx_log_debug4(NGX_LOG_DEBUG_CORE, cycle->log, 0, 
+                "[%d] dup %d listener %d for %d", ngx_process, i, ls[i].fd, pid);
+
+            if (WSADuplicateSocket(ls[i].fd, pid, &protoInfo[i]) != 0) {
+                ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_socket_errno,
+                    "WSADuplicateSocket() failed");
+                return NGX_ERROR;
+            };
+
         }
-
-        ngx_log_debug4(NGX_LOG_DEBUG_CORE, cycle->log, 0, 
-            "[%d] dup %d listener %d for %d", ngx_process, i, ls[i].fd, pid);
-
-        if (WSADuplicateSocket(ls[i].fd, pid, &protoInfo[i]) != 0) {
-            ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_socket_errno,
-                "WSADuplicateSocket() failed");
-            return NGX_ERROR;
-        };
-
     }
 
     shml->pid = pid;
diff -r 76ee2fe9300b -r b72d1091430e src/os/win32/ngx_socket.h
--- a/src/os/win32/ngx_socket.h	Thu Jun 11 14:51:59 2015 +0200
+++ b/src/os/win32/ngx_socket.h	Fri Jun 12 12:12:46 2015 +0200
@@ -209,8 +209,9 @@ typedef WSAPROTOCOL_INFO * ngx_shared_so
 #define ngx_shared_socket(af, type, proto, shinfo)                           \
     WSASocket(af, type, proto, shinfo, 0, WSA_FLAG_OVERLAPPED)
 
-ngx_shared_socket_info ngx_get_listening_share_info(ngx_cycle_t *cycle, 
-    ngx_pid_t pid);
+ngx_int_t
+ngx_get_listening_share_info(ngx_cycle_t *cycle, 
+    ngx_shared_socket_info * pshinfo, ngx_pid_t pid);
 void ngx_free_listening_share(ngx_cycle_t *cycle);
 ngx_int_t ngx_share_listening_sockets(ngx_cycle_t *cycle, ngx_pid_t pid);
 
_______________________________________________
nginx-devel mailing list
nginx-devel@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-devel

Reply via email to