Hi, 

enclosed a further changeset with "backwards compatibility" to 1 worker
processing (without inheritance as before fix), if single worker
configured + a little bit code review. 

P.S. github updated also. 

Regards,
sebres. 

11.06.2015 15:03, Sergey Brester: 

> Hi, 
> 
> I've forgotten to free the shmem, thus enclosed an amendment with clean-up, 
> relative last changeset. 
> 
> Regards,
> sebres.
 
# HG changeset patch
# User sebres <serg.bres...@sebres.de>
# Date 1434103966 -7200
#      Fri Jun 12 12:12:46 2015 +0200
# Node ID 3499ecc86ec00deeef93869fc52a5ac02fd2e49f
# Parent  76ee2fe9300bdcf0dbf4a05e3ed7a1136b324eb7
backwards compatibility for single worker (without inheritance of socket) + code review

diff -r 76ee2fe9300b -r 3499ecc86ec0 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_SINGLE_WORKER) {
 
-                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 3499ecc86ec0 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 3499ecc86ec0 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 3499ecc86ec0 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 3499ecc86ec0 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