41a42,45
> static nxt_int_t nxt_controller_prefork(nxt_task_t *task,
> nxt_process_t *process, nxt_mp_t *mp);
> static nxt_int_t nxt_controller_start(nxt_task_t *task,
> nxt_process_data_t *data);
46a51,52
> static void nxt_controller_remove_pid_handler(nxt_task_t *task,
> nxt_port_recv_msg_t *msg);
85a92,93
> static void nxt_controller_cert_cleanup(nxt_task_t *task, void *obj,
> void *data);
117,118c125,126
< nxt_port_handlers_t nxt_controller_process_port_handlers = {
< .quit = nxt_worker_process_quit_handler,
---
> static const nxt_port_handlers_t nxt_controller_process_port_handlers = {
> .quit = nxt_signal_quit_handler,
124c132
< .remove_pid = nxt_port_remove_pid_handler,
---
> .remove_pid = nxt_controller_remove_pid_handler,
130,131c138,151
< nxt_int_t
< nxt_controller_start(nxt_task_t *task, void *data)
---
> const nxt_process_init_t nxt_controller_process = {
> .name = "controller",
> .type = NXT_PROCESS_CONTROLLER,
> .prefork = nxt_controller_prefork,
> .restart = 1,
> .setup = nxt_process_core_setup,
> .start = nxt_controller_start,
> .port_handlers = &nxt_controller_process_port_handlers,
> .signals = nxt_process_signals,
> };
>
>
> static nxt_int_t
> nxt_controller_prefork(nxt_task_t *task, nxt_process_t *process, nxt_mp_t *mp)
132a153,236
> ssize_t n;
> nxt_int_t ret;
> nxt_str_t *conf;
> nxt_file_t file;
> nxt_runtime_t *rt;
> nxt_file_info_t fi;
> nxt_controller_init_t ctrl_init;
>
> nxt_log(task, NXT_LOG_INFO, "controller started");
>
> rt = task->thread->runtime;
>
> nxt_memzero(&ctrl_init, sizeof(nxt_controller_init_t));
>
> conf = &ctrl_init.conf;
>
> nxt_memzero(&file, sizeof(nxt_file_t));
>
> file.name = (nxt_file_name_t *) rt->conf;
>
> ret = nxt_file_open(task, &file, NXT_FILE_RDONLY, NXT_FILE_OPEN, 0);
>
> if (ret == NXT_OK) {
> ret = nxt_file_info(&file, &fi);
>
> if (nxt_fast_path(ret == NXT_OK && nxt_is_file(&fi))) {
> conf->length = nxt_file_size(&fi);
> conf->start = nxt_mp_alloc(mp, conf->length);
> if (nxt_slow_path(conf->start == NULL)) {
> nxt_file_close(task, &file);
> return NXT_ERROR;
> }
>
> n = nxt_file_read(&file, conf->start, conf->length, 0);
>
> if (nxt_slow_path(n != (ssize_t) conf->length)) {
> conf->start = NULL;
> conf->length = 0;
>
> nxt_alert(task, "failed to restore previous configuration: "
> "cannot read the file");
> }
> }
>
> nxt_file_close(task, &file);
> }
>
> #if (NXT_TLS)
> ctrl_init.certs = nxt_cert_store_load(task, mp);
>
> nxt_mp_cleanup(mp, nxt_controller_cert_cleanup, task, ctrl_init.certs, rt);
> #endif
>
> process->data.controller = ctrl_init;
>
> return NXT_OK;
> }
>
>
> #if (NXT_TLS)
>
> static void
> nxt_controller_cert_cleanup(nxt_task_t *task, void *obj, void *data)
> {
> pid_t main_pid;
> nxt_array_t *certs;
> nxt_runtime_t *rt;
>
> certs = obj;
> rt = data;
>
> main_pid = rt->port_by_type[NXT_PROCESS_MAIN]->pid;
>
> if (nxt_pid == main_pid && certs != NULL) {
> nxt_cert_store_release(certs);
> }
> }
>
> #endif
>
>
> static nxt_int_t
> nxt_controller_start(nxt_task_t *task, nxt_process_data_t *data)
> {
150c254
< init = data;
---
> init = &data->controller;
153d256
<
158d260
<
173,174d274
< nxt_free(json->start);
<
297a398,419
> static void
> nxt_controller_remove_pid_handler(nxt_task_t *task, nxt_port_recv_msg_t *msg)
> {
> nxt_pid_t pid;
> nxt_process_t *process;
> nxt_runtime_t *rt;
>
> rt = task->thread->runtime;
>
> nxt_assert(nxt_buf_used_size(msg->buf) == sizeof(pid));
>
> nxt_memcpy(&pid, msg->buf->mem.pos, sizeof(pid));
>
> process = nxt_runtime_process_find(rt, pid);
> if (process != NULL && nxt_process_type(process) == NXT_PROCESS_ROUTER) {
> nxt_controller_router_ready = 0;
> }
>
> nxt_port_remove_pid_handler(task, msg);
> }
>
>