/*
* Copyright (C) Igor Sysoev
* Copyright (C) Valentin V. Bartenev
* Copyright (C) NGINX, Inc.
*/
#ifndef _NXT_CYCLE_H_INCLUDED_
#define _NXT_CYCLE_H_INCLUDED_
typedef enum {
NXT_PROCESS_SINGLE = 0,
NXT_PROCESS_MASTER,
NXT_PROCESS_WORKER,
} nxt_process_type_e;
typedef struct nxt_cycle_s nxt_cycle_t;
typedef void (*nxt_cycle_cont_t)(nxt_thread_t *thr, nxt_cycle_t *cycle);
struct nxt_cycle_s {
nxt_mem_pool_t *mem_pool;
nxt_cycle_t *previous;
nxt_array_t *inherited_sockets; /* of nxt_listen_socket_t */
nxt_array_t *listen_sockets; /* of nxt_listen_socket_t */
nxt_array_t *services; /* of nxt_service_t */
nxt_array_t *engines; /* of nxt_event_engine_t */
nxt_cycle_cont_t start;
nxt_str_t *config_name;
nxt_str_t *conf_prefix;
nxt_str_t *prefix;
nxt_str_t hostname;
nxt_file_name_t *pid_file;
nxt_file_name_t *oldbin_file;
nxt_pid_t new_binary;
#if (NXT_THREADS)
nxt_array_t *thread_pools; /* of nxt_thread_pool_t */
nxt_cycle_cont_t continuation;
#endif
nxt_array_t *processes; /* of nxt_process_chan_t */
nxt_list_t *log_files; /* of nxt_file_t */
nxt_array_t *shm_zones; /* of nxt_cycle_shm_zone_t */
uint32_t process_generation;
uint32_t current_process;
uint32_t last_engine_id;
nxt_process_type_e type;
uint8_t test_config; /* 1 bit */
uint8_t reconfiguring; /* 1 bit */
void **core_ctx;
nxt_event_timer_t timer;
uint8_t daemon;
uint8_t batch;
uint8_t master_process;
const char *engine;
uint32_t engine_connections;
uint32_t worker_processes;
uint32_t auxiliary_threads;
nxt_user_cred_t user_cred;
const char *group;
const char *pid;
const char *error_log;
nxt_sockaddr_t *listen;
};
typedef struct {
void *addr;
size_t size;
nxt_uint_t page_size;
nxt_str_t name;
} nxt_cycle_shm_zone_t;
typedef nxt_int_t (*nxt_module_init_t)(nxt_thread_t *thr, nxt_cycle_t *cycle);
nxt_thread_extern_data(nxt_cycle_t *, nxt_thread_cycle_data);
nxt_inline void
nxt_thread_cycle_set(nxt_cycle_t *cycle)
{
nxt_cycle_t **p;
p = nxt_thread_get_data(nxt_thread_cycle_data);
*p = cycle;
}
nxt_inline nxt_cycle_t *
nxt_thread_cycle(void)
{
nxt_cycle_t **p;
p = nxt_thread_get_data(nxt_thread_cycle_data);
return *p;
}
nxt_int_t nxt_cycle_create(nxt_thread_t *thr, nxt_cycle_t *previous,
nxt_cycle_cont_t start, nxt_str_t *config_name, nxt_bool_t test_config);
void nxt_cycle_quit(nxt_thread_t *thr, nxt_cycle_t *cycle);
void nxt_cycle_event_engine_free(nxt_cycle_t *cycle);
#if (NXT_THREADS)
nxt_int_t nxt_cycle_thread_pool_create(nxt_thread_t *thr, nxt_cycle_t *cycle,
nxt_uint_t max_threads, nxt_nsec_t timeout);
#endif
/* STUB */
nxt_str_t *nxt_current_directory(nxt_mem_pool_t *mp);
nxt_int_t nxt_cycle_pid_file_create(nxt_file_name_t *pid_file, nxt_bool_t test);
nxt_listen_socket_t *nxt_cycle_listen_socket_add(nxt_cycle_t *cycle,
nxt_sockaddr_t *sa);
nxt_int_t nxt_cycle_listen_sockets_enable(nxt_thread_t *thr,
nxt_cycle_t *cycle);
nxt_file_t *nxt_cycle_log_file_add(nxt_cycle_t *cycle, nxt_str_t *name);
nxt_int_t nxt_cycle_shm_zone_add(nxt_cycle_t *cycle, nxt_str_t *name,
size_t size, nxt_uint_t page_size);
/* STUB */
void nxt_cdecl nxt_log_time_handler(nxt_uint_t level, nxt_log_t *log,
const char *fmt, ...);
nxt_int_t nxt_app_start(nxt_cycle_t *cycle);
extern nxt_module_init_t nxt_init_modules[];
extern nxt_uint_t nxt_init_modules_n;
#endif /* _NXT_CYCLE_H_INCLIDED_ */