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