nginx-0.0.1-2004-01-05-23:55:48 import
diff --git a/src/core/nginx.c b/src/core/nginx.c
index 4ae4d09..a36aad0 100644
--- a/src/core/nginx.c
+++ b/src/core/nginx.c
@@ -5,18 +5,15 @@
#include <nginx.h>
-/* STUB */
-void stub_init(ngx_cycle_t *cycle);
-
-
-
-static ngx_cycle_t *ngx_init_cycle(ngx_cycle_t *old_cycle, ngx_log_t *log);
-static int ngx_open_listening_sockets(ngx_cycle_t *cycle, ngx_log_t *log);
-static void ngx_clean_old_cycles(ngx_event_t *ev);
+static void ngx_worker_process_cycle(ngx_cycle_t *cycle, void *data);
+static void ngx_exec_new_binary(ngx_cycle_t *cycle, char *const *argv);
+static ngx_int_t ngx_core_module_init(ngx_cycle_t *cycle);
typedef struct {
+ ngx_str_t user;
int daemon;
+ int single;
ngx_str_t pid;
} ngx_core_conf_t;
@@ -25,6 +22,13 @@
static ngx_command_t ngx_core_commands[] = {
+ { ngx_string("user"),
+ NGX_MAIN_CONF|NGX_CONF_TAKE1,
+ ngx_conf_set_core_str_slot,
+ 0,
+ offsetof(ngx_core_conf_t, user),
+ NULL },
+
{ ngx_string("daemon"),
NGX_MAIN_CONF|NGX_CONF_TAKE1,
ngx_conf_set_core_flag_slot,
@@ -32,6 +36,13 @@
offsetof(ngx_core_conf_t, daemon),
NULL },
+ { ngx_string("single_process"),
+ NGX_MAIN_CONF|NGX_CONF_TAKE1,
+ ngx_conf_set_core_flag_slot,
+ 0,
+ offsetof(ngx_core_conf_t, single),
+ NULL },
+
ngx_null_command
};
@@ -41,44 +52,46 @@
&core_name, /* module context */
ngx_core_commands, /* module directives */
NGX_CORE_MODULE, /* module type */
- NULL, /* init module */
+ ngx_core_module_init, /* init module */
NULL /* init child */
};
-int ngx_max_module;
-ngx_os_io_t ngx_io;
-
-volatile ngx_cycle_t *ngx_cycle;
-ngx_array_t ngx_old_cycles;
-
-static ngx_pool_t *ngx_temp_pool;
-static ngx_event_t ngx_cleaner_event;
+ngx_int_t ngx_max_module;
-/* STUB NAME */
-static ngx_connection_t dumb;
+/* STUB */
+uid_t user;
u_int ngx_connection_counter;
-
-int done;
-int restart;
-int rotate;
+ngx_int_t ngx_master;
+ngx_int_t ngx_single;
-int main(int argc, char *const *argv)
+ngx_int_t ngx_respawn;
+ngx_int_t ngx_terminate;
+ngx_int_t ngx_quit;
+ngx_int_t ngx_reconfigure;
+ngx_int_t ngx_reopen;
+ngx_int_t ngx_change_binary;
+
+
+int main(int argc, char *const *argv, char **envp)
{
- int i;
- ngx_fd_t fd;
- ngx_log_t *log;
- ngx_cycle_t *cycle, init_cycle;
- ngx_open_file_t *file;
+ struct timeval tv;
+ ngx_fd_t fd;
+ ngx_int_t i;
+ ngx_err_t err;
+ ngx_log_t *log;
+ ngx_cycle_t *cycle, init_cycle;
+ ngx_open_file_t *file;
+ ngx_core_conf_t *ccf;
#if !(WIN32)
- size_t len;
- char pid[/* STUB */ 10];
- ngx_file_t pidfile;
- ngx_core_conf_t *ccf;
+ size_t len;
+ char pid[/* STUB */ 10];
+ ngx_file_t pidfile;
+ struct passwd *pwd;
#endif
#if __FreeBSD__
@@ -94,7 +107,6 @@
log = ngx_log_init_errlog();
-
/* init_cycle->log is required for signal handlers */
ngx_memzero(&init_cycle, sizeof(ngx_cycle_t));
@@ -110,16 +122,46 @@
ngx_modules[i]->index = ngx_max_module++;
}
- cycle = ngx_init_cycle(NULL, log);
+ if (!(init_cycle.pool = ngx_create_pool(1024, log))) {
+ return 1;
+ }
+
+ if (ngx_set_inherited_sockets(&init_cycle, envp) == NGX_ERROR) {
+ return 1;
+ }
+
+ cycle = ngx_init_cycle(&init_cycle);
if (cycle == NULL) {
return 1;
}
ngx_cycle = cycle;
+ ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);
+
+ if (ccf->single == 1) {
+ ngx_master = 0;
+ ngx_single = 1;
+
+ } else {
+ ngx_master = 1;
+ ngx_single = 0;
+ }
+
#if !(WIN32)
- ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);
+ /* STUB */
+ if (ccf->user.len) {
+ pwd = getpwnam(ccf->user.data);
+ if (pwd == NULL) {
+ ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,
+ "getpwnam(%s) failed", ccf->user);
+ return 1;
+ }
+
+ user = pwd->pw_uid;
+ }
+ /* */
if (ccf->daemon != 0) {
if (ngx_daemon(cycle->log) == NGX_ERROR) {
@@ -162,48 +204,64 @@
#endif
- /* life cycle */
+ /* a life cycle */
for ( ;; ) {
-#if 0
- /* STUB */ cycle->log->log_level = NGX_LOG_DEBUG|NGX_LOG_DEBUG_HTTP;
-#endif
+ ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "new cycle");
-#if 0
+ if (ngx_master) {
+ ngx_spawn_process(cycle, ngx_worker_process_cycle, NULL,
+ "worker process", NGX_PROCESS_RESPAWN);
-#if !(WIN32)
- ngx_spawn_process(cycle->log);
-#endif
+ } else {
+ ngx_init_temp_number();
- stub_init(cycle);
-#endif
-
- /* TODO: forks */
-
- ngx_init_temp_number();
-
- for (i = 0; ngx_modules[i]; i++) {
- if (ngx_modules[i]->init_child) {
- if (ngx_modules[i]->init_child(cycle) == NGX_ERROR) {
- /* fatal */
- exit(1);
+ for (i = 0; ngx_modules[i]; i++) {
+ if (ngx_modules[i]->init_process) {
+ if (ngx_modules[i]->init_process(cycle) == NGX_ERROR) {
+ /* fatal */
+ exit(1);
+ }
}
}
}
- /* TODO: threads */
+#if 0
+ reconfigure = 0;
+ reopen = 0;
+#endif
- restart = 0;
- rotate = 0;
+ /* a cycle with the same configuration */
for ( ;; ) {
+ /* an event loop */
+
for ( ;; ) {
- ngx_log_debug(cycle->log, "worker cycle");
- ngx_process_events(cycle->log);
+ err = 0;
- if (done) {
+ if (ngx_single) {
+ ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
+ "worker cycle");
+
+ ngx_process_events(cycle->log);
+
+ } else {
+ ngx_set_errno(0);
+ ngx_msleep(1000);
+ err = ngx_errno;
+
+ ngx_gettimeofday(&tv);
+ ngx_time_update(tv.tv_sec);
+
+ if (err) {
+ ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, err,
+ "sleep() exited");
+ }
+ }
+
+ if (ngx_quit || ngx_terminate) {
#if !(WIN32)
if (ngx_delete_file(pidfile.name.data) == NGX_FILE_ERROR) {
ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
@@ -212,90 +270,70 @@
}
#endif
- ngx_log_error(NGX_LOG_INFO,
- cycle->log, 0, "exiting");
+ ngx_log_error(NGX_LOG_INFO, cycle->log, 0, "exiting");
+
+ if (ngx_master) {
+ ngx_signal_processes(cycle,
+ ngx_signal_value(NGX_SHUTDOWN_SIGNAL));
+
+ /* TODO: wait workers */
+
+ ngx_msleep(1000);
+
+ ngx_gettimeofday(&tv);
+ ngx_time_update(tv.tv_sec);
+ }
+
+ ngx_log_error(NGX_LOG_INFO, cycle->log, 0, "exit");
exit(0);
}
- if (rotate) {
- ngx_log_error(NGX_LOG_INFO, cycle->log, 0, "reopen logs");
-
- file = cycle->open_files.elts;
- for (i = 0; i < cycle->open_files.nelts; i++) {
- if (file[i].name.data == NULL) {
- continue;
- }
-
- fd = ngx_open_file(file[i].name.data,
- NGX_FILE_RDWR,
- NGX_FILE_CREATE_OR_OPEN|NGX_FILE_APPEND);
-
-ngx_log_debug(log, "REOPEN: %d:%d:%s" _ fd _ file[i].fd _ file[i].name.data);
-
- if (fd == NGX_INVALID_FILE) {
- ngx_log_error(NGX_LOG_EMERG,
- cycle->log, ngx_errno,
- ngx_open_file_n " \"%s\" failed",
- file[i].name.data);
- continue;
- }
-
-#if (WIN32)
- if (ngx_file_append_mode(fd) == NGX_ERROR) {
- ngx_log_error(NGX_LOG_EMERG,
- cycle->log, ngx_errno,
- ngx_file_append_mode_n
- " \"%s\" failed",
- file[i].name.data);
-
- if (ngx_close_file(fd) == NGX_FILE_ERROR) {
- ngx_log_error(NGX_LOG_EMERG,
- cycle->log, ngx_errno,
- ngx_close_file_n " \"%s\" failed",
- file[i].name.data);
- }
-
- continue;
- }
-#endif
-
- if (ngx_close_file(file[i].fd) == NGX_FILE_ERROR) {
- ngx_log_error(NGX_LOG_EMERG,
- cycle->log, ngx_errno,
- ngx_close_file_n " \"%s\" failed",
- file[i].name.data);
- }
-
- file[i].fd = fd;
- }
-
- rotate = 0;
+ if (err == NGX_EINTR) {
+ ngx_respawn_processes(cycle);
}
- if (restart) {
- ngx_log_debug(cycle->log, "restart");
+ if (ngx_change_binary) {
+ ngx_change_binary = 0;
+ ngx_log_error(NGX_LOG_INFO, cycle->log, 0,
+ "changing binary");
+ ngx_exec_new_binary(cycle, argv);
+ /* TODO: quit workers */
+ }
+
+ if (ngx_reconfigure) {
+ ngx_log_error(NGX_LOG_INFO, cycle->log, 0, "reconfiguring");
break;
}
+ if (ngx_reopen) {
+ ngx_log_error(NGX_LOG_INFO, cycle->log, 0,
+ "reopening logs");
+ ngx_reopen_files(cycle);
+ ngx_reopen = 0;
+ }
+
}
- cycle = ngx_init_cycle(cycle, cycle->log);
+ cycle = ngx_init_cycle(cycle);
if (cycle == NULL) {
cycle = (ngx_cycle_t *) ngx_cycle;
continue;
}
ngx_cycle = cycle;
+ ngx_reconfigure = 0;
break;
}
}
}
+#if 0
-static ngx_cycle_t *ngx_init_cycle(ngx_cycle_t *old_cycle, ngx_log_t *log)
+static ngx_cycle_t *ngx_init_cycle(ngx_cycle_t *old_cycle)
{
- int i, n, failed;
+ ngx_int_t i, n, failed;
ngx_str_t conf_file;
+ ngx_log_t *log;
ngx_conf_t conf;
ngx_pool_t *pool;
ngx_cycle_t *cycle, **old;
@@ -304,6 +342,7 @@
ngx_open_file_t *file;
ngx_listening_t *ls, *nls;
+ log = old_cycle->log;
if (!(pool = ngx_create_pool(16 * 1024, log))) {
return NULL;
@@ -318,7 +357,7 @@
cycle->old_cycle = old_cycle;
- n = old_cycle ? old_cycle->pathes.nelts : 10;
+ n = old_cycle->pathes.nelts ? old_cycle->pathes.nelts : 10;
if (!(cycle->pathes.elts = ngx_pcalloc(pool, n * sizeof(ngx_path_t *)))) {
ngx_destroy_pool(pool);
return NULL;
@@ -329,7 +368,7 @@
cycle->pathes.pool = pool;
- n = old_cycle ? old_cycle->open_files.nelts : 20;
+ n = old_cycle->open_files.nelts ? old_cycle->open_files.nelts : 20;
cycle->open_files.elts = ngx_pcalloc(pool, n * sizeof(ngx_open_file_t));
if (cycle->open_files.elts == NULL) {
ngx_destroy_pool(pool);
@@ -347,7 +386,7 @@
}
- n = old_cycle ? old_cycle->listening.nelts : 10;
+ n = old_cycle->listening.nelts ? old_cycle->listening.nelts : 10;
cycle->listening.elts = ngx_pcalloc(pool, n * sizeof(ngx_listening_t));
if (cycle->listening.elts == NULL) {
ngx_destroy_pool(pool);
@@ -375,6 +414,7 @@
* ccf->pid = NULL;
*/
ccf->daemon = -1;
+ ccf->single = -1;
((void **)(cycle->conf_ctx))[ngx_core_module.index] = ccf;
@@ -435,12 +475,8 @@
#endif
}
-#if 0
- /* STUB */ cycle->log->log_level = NGX_LOG_DEBUG;
-#endif
-
if (!failed) {
- if (old_cycle) {
+ if (old_cycle->listening.nelts) {
ls = old_cycle->listening.elts;
for (i = 0; i < old_cycle->listening.nelts; i++) {
ls[i].remain = 0;
@@ -449,6 +485,15 @@
nls = cycle->listening.elts;
for (n = 0; n < cycle->listening.nelts; n++) {
for (i = 0; i < old_cycle->listening.nelts; i++) {
+ if (ls[i].ignore) {
+ continue;
+ }
+
+ ngx_log_error(NGX_LOG_INFO, log, 0,
+ "%X, %X",
+ *(int *) ls[i].sockaddr,
+ *(int *) nls[n].sockaddr);
+
if (ngx_memcmp(nls[n].sockaddr,
ls[i].sockaddr, ls[i].socklen) == 0)
{
@@ -492,7 +537,7 @@
}
if (!failed) {
- if (ngx_open_listening_sockets(cycle, log) == NGX_ERROR) {
+ if (ngx_open_listening_sockets(cycle) == NGX_ERROR) {
failed = 1;
}
}
@@ -536,9 +581,6 @@
pool->log = cycle->log;
-#if 1
- /* STUB */ cycle->one_process = 1;
-#endif
for (i = 0; ngx_modules[i]; i++) {
if (ngx_modules[i]->init_module) {
@@ -549,9 +591,9 @@
}
}
- if (old_cycle == NULL) {
- return cycle;
- }
+ /* close and delete stuff that lefts from an old cycle */
+
+ /* close the unneeded listening sockets */
ls = old_cycle->listening.elts;
for (i = 0; i < old_cycle->listening.nelts; i++) {
@@ -566,6 +608,9 @@
}
}
+
+ /* close the unneeded open files */
+
file = old_cycle->open_files.elts;
for (i = 0; i < old_cycle->open_files.nelts; i++) {
if (file[i].fd == NGX_INVALID_FILE) {
@@ -579,8 +624,13 @@
}
}
+ if (old_cycle->connections == NULL) {
+ /* an old cycle is an init cycle */
+ ngx_destroy_pool(old_cycle->pool);
+ return cycle;
+ }
- if (!old_cycle->one_process) {
+ if (master) {
ngx_destroy_pool(old_cycle->pool);
return cycle;
}
@@ -626,190 +676,233 @@
return cycle;
}
-
-static int ngx_open_listening_sockets(ngx_cycle_t *cycle, ngx_log_t *log)
-{
- int times, failed, reuseaddr, i;
- ngx_err_t err;
- ngx_socket_t s;
- ngx_listening_t *ls;
-
- reuseaddr = 1;
-#if (NGX_SUPPRESS_WARN)
- failed = 0;
#endif
- /* TODO: times configurable */
-
- for (times = 10; times; times--) {
- failed = 0;
-
- /* for each listening socket */
-
- ls = cycle->listening.elts;
- for (i = 0; i < cycle->listening.nelts; i++) {
-
- if (ls[i].fd != -1) {
- continue;
- }
-
- if (ls[i].inherited) {
-
- /* TODO: close on exit */
- /* TODO: nonblocking */
- /* TODO: deferred accept */
-
- continue;
- }
-
- s = ngx_socket(ls[i].family, ls[i].type, ls[i].protocol,
- ls[i].flags);
-
- if (s == -1) {
- ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,
- ngx_socket_n " %s failed", ls[i].addr_text.data);
- return NGX_ERROR;
- }
-
-#if (WIN32)
- /*
- * Winsock assignes a socket number divisible by 4
- * so to find a connection we divide a socket number by 4.
- */
-
- if (s % 4) {
- ngx_log_error(NGX_LOG_EMERG, ls->log, 0,
- ngx_socket_n " created socket %d", s);
- return NGX_ERROR;
- }
-#endif
-
- if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR,
- (const void *) &reuseaddr, sizeof(int)) == -1) {
- ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,
- "setsockopt(SO_REUSEADDR) %s failed",
- ls[i].addr_text.data);
- return NGX_ERROR;
- }
-
- /* TODO: close on exit */
-
- if (!(ngx_event_flags & NGX_USE_AIO_EVENT)) {
- if (ngx_nonblocking(s) == -1) {
- ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,
- ngx_nonblocking_n " %s failed",
- ls[i].addr_text.data);
- return NGX_ERROR;
- }
- }
#if 0
- if (ls[i].nonblocking) {
- if (ngx_nonblocking(s) == -1) {
- ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,
- ngx_nonblocking_n " %s failed",
- ls[i].addr_text.data);
+
+static ngx_int_t ngx_set_inherited_sockets(ngx_cycle_t *cycle, char **envp)
+{
+ char *p, *v;
+ ngx_socket_t s;
+ ngx_listening_t *ls;
+ struct sockaddr_in *addr_in;
+
+ for ( /* void */ ; *envp; envp++) {
+ if (ngx_strncmp(*envp, NGINX_VAR, NGINX_VAR_LEN) != 0) {
+ continue;
+ }
+
+ ngx_log_error(NGX_LOG_INFO, cycle->log, 0,
+ "using inherited sockets from \"%s\"", *envp);
+
+ ngx_init_array(cycle->listening, cycle->pool,
+ 10, sizeof(ngx_listening_t), NGX_ERROR);
+
+ for (p = *envp + NGINX_VAR_LEN, v = p; *p; p++) {
+ if (*p == ':' || *p == ';') {
+ s = ngx_atoi(v, p - v);
+ if (s == NGX_ERROR) {
+ ngx_log_error(NGX_LOG_EMERG, cycle->log, 0,
+ "invalid socket number \"%s\" "
+ "in NGINX enviroment variable, "
+ "ignoring the rest of the variable", v);
+ break;
+ }
+ v = p + 1;
+
+ if (!(ls = ngx_push_array(&cycle->listening))) {
+ return NGX_ERROR;
+ }
+
+ ls->fd = s;
+
+ /* AF_INET only */
+
+ ls->sockaddr = ngx_palloc(cycle->pool,
+ sizeof(struct sockaddr_in));
+ if (ls->sockaddr == NULL) {
+ return NGX_ERROR;
+ }
+
+ ls->socklen = sizeof(struct sockaddr_in);
+ if (getsockname(s, ls->sockaddr, &ls->socklen) == -1) {
+ ngx_log_error(NGX_LOG_CRIT, cycle->log, ngx_socket_errno,
+ "getsockname() of the inherited "
+ "socket #%d failed", s);
+ ls->ignore = 1;
+ continue;
+ }
+
+ addr_in = (struct sockaddr_in *) ls->sockaddr;
+
+ if (addr_in->sin_family != AF_INET) {
+ ngx_log_error(NGX_LOG_CRIT, cycle->log, ngx_socket_errno,
+ "the inherited socket #%d has "
+ "unsupported family", s);
+ ls->ignore = 1;
+ continue;
+ }
+ ls->addr_text_max_len = INET_ADDRSTRLEN;
+
+ ls->addr_text.data = ngx_palloc(cycle->pool,
+ ls->addr_text_max_len);
+ if (ls->addr_text.data == NULL) {
+ return NGX_ERROR;
+ }
+
+ addr_in->sin_len = 0;
+
+ ls->family = addr_in->sin_family;
+ ls->addr_text.len = ngx_sock_ntop(ls->family, ls->sockaddr,
+ ls->addr_text.data,
+ ls->addr_text_max_len);
+ if (ls->addr_text.len == 0) {
return NGX_ERROR;
}
}
-#endif
-
- if (bind(s, ls[i].sockaddr, ls[i].socklen) == -1) {
- err = ngx_socket_errno;
- ngx_log_error(NGX_LOG_EMERG, log, err,
- "bind() to %s failed", ls[i].addr_text.data);
-
- if (err != NGX_EADDRINUSE)
- return NGX_ERROR;
-
- if (ngx_close_socket(s) == -1)
- ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,
- ngx_close_socket_n " %s failed",
- ls[i].addr_text.data);
-
- failed = 1;
- continue;
- }
-
- if (listen(s, ls[i].backlog) == -1) {
- ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,
- "listen() to %s failed", ls[i].addr_text.data);
- return NGX_ERROR;
- }
-
- /* TODO: deferred accept */
-
- ls[i].fd = s;
}
- if (!failed)
- break;
-
- /* TODO: delay configurable */
-
- ngx_log_error(NGX_LOG_NOTICE, log, 0,
- "try again to bind() after 500ms");
- ngx_msleep(500);
- }
-
- if (failed) {
- ngx_log_error(NGX_LOG_EMERG, log, 0, "still can not bind()");
- return NGX_ERROR;
+ break;
}
return NGX_OK;
}
+#endif
-static void ngx_clean_old_cycles(ngx_event_t *ev)
+
+static void ngx_worker_process_cycle(ngx_cycle_t *cycle, void *data)
{
- int i, n, found, live;
- ngx_log_t *log;
- ngx_cycle_t **cycle;
+ ngx_int_t i;
+ ngx_listening_t *ls;
- log = ngx_cycle->log;
- ngx_temp_pool->log = log;
-
- ngx_log_debug(log, "clean old cycles");
-
- live = 0;
-
- cycle = ngx_old_cycles.elts;
- for (i = 0; i < ngx_old_cycles.nelts; i++) {
-
- if (cycle[i] == NULL) {
- continue;
+ if (user) {
+ if (setuid(user) == -1) {
+ ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
+ "setuid() failed");
+ /* fatal */
+ exit(1);
}
+ }
- found = 0;
+ ngx_init_temp_number();
- for (n = 0; n < cycle[i]->connection_n; n++) {
- if (cycle[i]->connections[n].fd != -1) {
- found = 1;
- ngx_log_debug(log, "live fd: %d" _ n);
- break;
+ /*
+ * disable deleting previous events for the listening sockets because
+ * in the worker processes there are no events at all at this point
+ */
+ ls = cycle->listening.elts;
+ for (i = 0; i < cycle->listening.nelts; i++) {
+ ls[i].remain = 0;
+ }
+
+ for (i = 0; ngx_modules[i]; i++) {
+ if (ngx_modules[i]->init_process) {
+ if (ngx_modules[i]->init_process(cycle) == NGX_ERROR) {
+ /* fatal */
+ exit(1);
}
}
+ }
- if (found) {
- live = 1;
- continue;
+ /* TODO: threads: start ngx_worker_thread_cycle() */
+
+ for ( ;; ) {
+ ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "worker cycle");
+
+ ngx_process_events(cycle->log);
+
+ if (ngx_terminate) {
+ ngx_log_error(NGX_LOG_INFO, cycle->log, 0, "exiting");
+ exit(0);
}
- ngx_log_debug(log, "clean old cycle: %d" _ i);
- ngx_destroy_pool(cycle[i]->pool);
- cycle[i] = NULL;
+ if (ngx_quit) {
+ ngx_log_error(NGX_LOG_INFO, cycle->log, 0,
+ "gracefully shutdowning");
+ break;
+ }
+
+ if (ngx_reopen) {
+ ngx_log_error(NGX_LOG_INFO, cycle->log, 0, "reopen logs");
+ ngx_reopen_files(cycle);
+ ngx_reopen = 0;
+ }
}
- ngx_log_debug(log, "old cycles status: %d" _ live);
+ ngx_close_listening_sockets(cycle);
- if (live) {
- ngx_log_debug(log, "TIMER");
- ngx_add_timer(ev, 30000);
+ for ( ;; ) {
+ if (ngx_event_timer_rbtree == &ngx_event_timer_sentinel) {
+ ngx_log_error(NGX_LOG_INFO, cycle->log, 0, "exiting");
+ exit(0);
+ }
- } else {
- ngx_destroy_pool(ngx_temp_pool);
- ngx_temp_pool = NULL;
- ngx_old_cycles.nelts = 0;
+ ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "worker cycle");
+
+ ngx_process_events(cycle->log);
}
}
+
+
+static void ngx_exec_new_binary(ngx_cycle_t *cycle, char *const *argv)
+{
+ char *env[2], *var, *p;
+ ngx_int_t i;
+ ngx_exec_ctx_t ctx;
+ ngx_listening_t *ls;
+
+ ctx.path = argv[0];
+ ctx.name = "new binary process";
+ ctx.argv = argv;
+
+ var = ngx_alloc(NGINX_VAR_LEN
+ + cycle->listening.nelts * (NGX_INT32_LEN + 1) + 1,
+ cycle->log);
+
+ p = ngx_cpymem(var, NGINX_VAR, NGINX_VAR_LEN);
+
+ ls = cycle->listening.elts;
+ for (i = 0; i < cycle->listening.nelts; i++) {
+ p += ngx_snprintf(p, NGX_INT32_LEN + 2, "%u;", ls[i].fd);
+ }
+
+ env[0] = var;
+ env[1] = NULL;
+ ctx.envp = (char *const *) &env;
+
+ ngx_exec(cycle, &ctx);
+
+ ngx_free(var);
+}
+
+
+static ngx_int_t ngx_core_module_init(ngx_cycle_t *cycle)
+{
+ ngx_core_conf_t *ccf;
+
+ /*
+ * ngx_core_module has a special init procedure: it is called by
+ * ngx_init_cycle() before the configuration file parsing to create
+ * ngx_core_module configuration and to set its default parameters
+ */
+
+ if (((void **)(cycle->conf_ctx))[ngx_core_module.index] != NULL) {
+ return NGX_OK;
+ }
+
+ if (!(ccf = ngx_pcalloc(cycle->pool, sizeof(ngx_core_conf_t)))) {
+ return NGX_ERROR;
+ }
+ /* set by pcalloc()
+ *
+ * ccf->pid = NULL;
+ */
+ ccf->daemon = -1;
+ ccf->single = -1;
+
+ ((void **)(cycle->conf_ctx))[ngx_core_module.index] = ccf;
+
+ return NGX_OK;
+}