xref: /unit/src/nxt_process.h (revision 1488)
10Sigor@sysoev.ru 
20Sigor@sysoev.ru /*
30Sigor@sysoev.ru  * Copyright (C) Igor Sysoev
40Sigor@sysoev.ru  * Copyright (C) NGINX, Inc.
50Sigor@sysoev.ru  */
60Sigor@sysoev.ru 
720Sigor@sysoev.ru #ifndef _NXT_PROCESS_H_INCLUDED_
820Sigor@sysoev.ru #define _NXT_PROCESS_H_INCLUDED_
920Sigor@sysoev.ru 
101306St.nateldemoura@f5.com #if (NXT_HAVE_CLONE)
11*1488St.nateldemoura@f5.com #include <unistd.h>
121306St.nateldemoura@f5.com #include <nxt_clone.h>
131306St.nateldemoura@f5.com #endif
141182St.nateldemoura@f5.com 
1520Sigor@sysoev.ru 
16*1488St.nateldemoura@f5.com #if (NXT_HAVE_CLONE)
17*1488St.nateldemoura@f5.com /*
18*1488St.nateldemoura@f5.com  * Old glibc wrapper for getpid(2) returns a cached pid invalidated only by
19*1488St.nateldemoura@f5.com  * fork(2) calls.  As we use clone(2) for container, it returns the wrong pid.
20*1488St.nateldemoura@f5.com  */
21*1488St.nateldemoura@f5.com #define nxt_getpid()                                                          \
22*1488St.nateldemoura@f5.com     syscall(__NR_getpid)
23*1488St.nateldemoura@f5.com #else
24*1488St.nateldemoura@f5.com #define nxt_getpid()                                                          \
25*1488St.nateldemoura@f5.com     getpid()
26*1488St.nateldemoura@f5.com #endif
27*1488St.nateldemoura@f5.com 
2820Sigor@sysoev.ru typedef pid_t            nxt_pid_t;
2920Sigor@sysoev.ru 
3020Sigor@sysoev.ru 
31*1488St.nateldemoura@f5.com typedef struct nxt_common_app_conf_s nxt_common_app_conf_t;
32*1488St.nateldemoura@f5.com 
33*1488St.nateldemoura@f5.com 
34*1488St.nateldemoura@f5.com typedef struct {
35*1488St.nateldemoura@f5.com     nxt_runtime_t              *rt;
36*1488St.nateldemoura@f5.com } nxt_discovery_init_t;
370Sigor@sysoev.ru 
38*1488St.nateldemoura@f5.com 
39*1488St.nateldemoura@f5.com typedef struct {
40*1488St.nateldemoura@f5.com     nxt_str_t                  conf;
41*1488St.nateldemoura@f5.com #if (NXT_TLS)
42*1488St.nateldemoura@f5.com     nxt_array_t                *certs;
43*1488St.nateldemoura@f5.com #endif
44*1488St.nateldemoura@f5.com } nxt_controller_init_t;
4520Sigor@sysoev.ru 
46141Smax.romanov@nginx.com 
47*1488St.nateldemoura@f5.com typedef union {
48*1488St.nateldemoura@f5.com     void                       *discovery;
49*1488St.nateldemoura@f5.com     nxt_controller_init_t      controller;
50*1488St.nateldemoura@f5.com     void                       *router;
51*1488St.nateldemoura@f5.com     nxt_common_app_conf_t      *app;
52*1488St.nateldemoura@f5.com } nxt_process_data_t;
53141Smax.romanov@nginx.com 
54*1488St.nateldemoura@f5.com 
55*1488St.nateldemoura@f5.com typedef enum {
56*1488St.nateldemoura@f5.com     NXT_PROCESS_STATE_CREATING = 0,
57*1488St.nateldemoura@f5.com     NXT_PROCESS_STATE_CREATED,
58*1488St.nateldemoura@f5.com     NXT_PROCESS_STATE_READY,
59*1488St.nateldemoura@f5.com } nxt_process_state_t;
6020Sigor@sysoev.ru 
6120Sigor@sysoev.ru 
62364Smax.romanov@nginx.com typedef struct nxt_port_mmap_s  nxt_port_mmap_t;
63*1488St.nateldemoura@f5.com 
64364Smax.romanov@nginx.com 
65*1488St.nateldemoura@f5.com typedef struct {
66364Smax.romanov@nginx.com     nxt_thread_mutex_t  mutex;
67364Smax.romanov@nginx.com     uint32_t            size;
68364Smax.romanov@nginx.com     uint32_t            cap;
69364Smax.romanov@nginx.com     nxt_port_mmap_t     *elts;
70*1488St.nateldemoura@f5.com } nxt_port_mmaps_t;
71364Smax.romanov@nginx.com 
72364Smax.romanov@nginx.com 
7320Sigor@sysoev.ru typedef struct {
74*1488St.nateldemoura@f5.com     nxt_pid_t            pid;
75*1488St.nateldemoura@f5.com     const char           *name;
76*1488St.nateldemoura@f5.com     nxt_queue_t          ports;      /* of nxt_port_t */
77*1488St.nateldemoura@f5.com     nxt_process_state_t  state;
78*1488St.nateldemoura@f5.com     nxt_bool_t           registered;
79*1488St.nateldemoura@f5.com     nxt_int_t            use_count;
80*1488St.nateldemoura@f5.com 
81*1488St.nateldemoura@f5.com     nxt_port_mmaps_t     incoming;
82*1488St.nateldemoura@f5.com     nxt_port_mmaps_t     outgoing;
83*1488St.nateldemoura@f5.com 
84*1488St.nateldemoura@f5.com     nxt_thread_mutex_t   cp_mutex;
85*1488St.nateldemoura@f5.com     nxt_lvlhsh_t         connected_ports; /* of nxt_port_t */
86*1488St.nateldemoura@f5.com 
87*1488St.nateldemoura@f5.com     uint32_t             stream;
88*1488St.nateldemoura@f5.com 
89*1488St.nateldemoura@f5.com     nxt_mp_t             *mem_pool;
90*1488St.nateldemoura@f5.com     nxt_credential_t     *user_cred;
91*1488St.nateldemoura@f5.com 
92*1488St.nateldemoura@f5.com     nxt_process_data_t   data;
9342Smax.romanov@nginx.com 
94*1488St.nateldemoura@f5.com     union {
95*1488St.nateldemoura@f5.com #if (NXT_HAVE_CLONE)
96*1488St.nateldemoura@f5.com         nxt_clone_t      clone;
97*1488St.nateldemoura@f5.com #endif
98*1488St.nateldemoura@f5.com     } isolation;
99*1488St.nateldemoura@f5.com } nxt_process_t;
100*1488St.nateldemoura@f5.com 
101141Smax.romanov@nginx.com 
102*1488St.nateldemoura@f5.com typedef nxt_int_t (*nxt_process_prefork_t)(nxt_task_t *task,
103*1488St.nateldemoura@f5.com     nxt_process_t *process, nxt_mp_t *mp);
104*1488St.nateldemoura@f5.com typedef nxt_int_t (*nxt_process_postfork_t)(nxt_task_t *task,
105*1488St.nateldemoura@f5.com     nxt_process_t *process, nxt_mp_t *mp);
106*1488St.nateldemoura@f5.com typedef nxt_int_t (*nxt_process_setup_t)(nxt_task_t *task,
107*1488St.nateldemoura@f5.com     nxt_process_t *process);
108*1488St.nateldemoura@f5.com typedef nxt_int_t (*nxt_process_start_t)(nxt_task_t *task,
109*1488St.nateldemoura@f5.com     nxt_process_data_t *data);
110*1488St.nateldemoura@f5.com 
11188Smax.romanov@nginx.com 
112*1488St.nateldemoura@f5.com typedef struct {
113*1488St.nateldemoura@f5.com     const char                 *name;
114*1488St.nateldemoura@f5.com     nxt_process_type_t         type;
115*1488St.nateldemoura@f5.com 
116*1488St.nateldemoura@f5.com     nxt_process_prefork_t      prefork;
117*1488St.nateldemoura@f5.com 
118*1488St.nateldemoura@f5.com     nxt_process_setup_t        setup;
119*1488St.nateldemoura@f5.com     nxt_process_start_t        start;
120*1488St.nateldemoura@f5.com 
121*1488St.nateldemoura@f5.com     uint8_t                    restart; /* 1-bit */
122*1488St.nateldemoura@f5.com 
123*1488St.nateldemoura@f5.com     const nxt_port_handlers_t  *port_handlers;
124*1488St.nateldemoura@f5.com     const nxt_sig_event_t      *signals;
125*1488St.nateldemoura@f5.com } nxt_process_init_t;
1260Sigor@sysoev.ru 
1270Sigor@sysoev.ru 
128761Smax.romanov@nginx.com extern nxt_bool_t  nxt_proc_conn_matrix[NXT_PROCESS_MAX][NXT_PROCESS_MAX];
129366Smax.romanov@nginx.com extern nxt_bool_t
130761Smax.romanov@nginx.com           nxt_proc_remove_notify_matrix[NXT_PROCESS_MAX][NXT_PROCESS_MAX];
131366Smax.romanov@nginx.com 
13220Sigor@sysoev.ru NXT_EXPORT nxt_pid_t nxt_process_create(nxt_task_t *task,
13378Smax.romanov@nginx.com     nxt_process_t *process);
13420Sigor@sysoev.ru NXT_EXPORT nxt_pid_t nxt_process_execute(nxt_task_t *task, char *name,
13520Sigor@sysoev.ru     char **argv, char **envp);
13620Sigor@sysoev.ru NXT_EXPORT nxt_int_t nxt_process_daemon(nxt_task_t *task);
13720Sigor@sysoev.ru NXT_EXPORT void nxt_nanosleep(nxt_nsec_t ns);
13820Sigor@sysoev.ru 
13920Sigor@sysoev.ru NXT_EXPORT void nxt_process_arguments(nxt_task_t *task, char **orig_argv,
14020Sigor@sysoev.ru     char ***orig_envp);
14120Sigor@sysoev.ru 
142*1488St.nateldemoura@f5.com #define nxt_process_init(process)                                             \
143*1488St.nateldemoura@f5.com     (nxt_pointer_to(process, sizeof(nxt_process_t)))
144*1488St.nateldemoura@f5.com 
14542Smax.romanov@nginx.com #define nxt_process_port_remove(port)                                         \
14642Smax.romanov@nginx.com     nxt_queue_remove(&port->link)
14742Smax.romanov@nginx.com 
14842Smax.romanov@nginx.com #define nxt_process_port_first(process)                                       \
14942Smax.romanov@nginx.com     nxt_queue_link_data(nxt_queue_first(&process->ports), nxt_port_t, link)
15042Smax.romanov@nginx.com 
151164Smax.romanov@nginx.com NXT_EXPORT void nxt_process_port_add(nxt_task_t *task, nxt_process_t *process,
152164Smax.romanov@nginx.com     nxt_port_t *port);
15342Smax.romanov@nginx.com 
15442Smax.romanov@nginx.com #define nxt_process_port_each(process, port)                                   \
15542Smax.romanov@nginx.com     nxt_queue_each(port, &process->ports, nxt_port_t, link)
15642Smax.romanov@nginx.com 
15742Smax.romanov@nginx.com #define nxt_process_port_loop                                                 \
15842Smax.romanov@nginx.com     nxt_queue_loop
15920Sigor@sysoev.ru 
160366Smax.romanov@nginx.com nxt_process_type_t nxt_process_type(nxt_process_t *process);
161366Smax.romanov@nginx.com 
1621254Shongzhidao@gmail.com void nxt_process_use(nxt_task_t *task, nxt_process_t *process, int i);
1631254Shongzhidao@gmail.com 
164349Smax.romanov@nginx.com void nxt_process_close_ports(nxt_task_t *task, nxt_process_t *process);
16588Smax.romanov@nginx.com 
1661452Smax.romanov@nginx.com void nxt_process_connected_port_add(nxt_process_t *process, nxt_port_t *port);
1671452Smax.romanov@nginx.com 
16888Smax.romanov@nginx.com void nxt_process_connected_port_remove(nxt_process_t *process,
16988Smax.romanov@nginx.com     nxt_port_t *port);
17088Smax.romanov@nginx.com 
1711452Smax.romanov@nginx.com nxt_port_t *nxt_process_connected_port_find(nxt_process_t *process,
1721446Smax.romanov@nginx.com     nxt_port_t *port);
17388Smax.romanov@nginx.com 
174*1488St.nateldemoura@f5.com void nxt_process_quit(nxt_task_t *task, nxt_uint_t exit_status);
175*1488St.nateldemoura@f5.com void nxt_signal_quit_handler(nxt_task_t *task, nxt_port_recv_msg_t *msg);
176248Svbart@nginx.com 
177*1488St.nateldemoura@f5.com nxt_int_t nxt_process_core_setup(nxt_task_t *task, nxt_process_t *process);
178*1488St.nateldemoura@f5.com nxt_int_t nxt_process_creds_set(nxt_task_t *task, nxt_process_t *process,
179*1488St.nateldemoura@f5.com     nxt_str_t *user, nxt_str_t *group);
180*1488St.nateldemoura@f5.com nxt_int_t nxt_process_apply_creds(nxt_task_t *task, nxt_process_t *process);
1811306St.nateldemoura@f5.com 
182*1488St.nateldemoura@f5.com #if (NXT_HAVE_CLONE_NEWUSER)
183*1488St.nateldemoura@f5.com nxt_int_t nxt_process_vldt_isolation_creds(nxt_task_t *task,
184*1488St.nateldemoura@f5.com     nxt_process_t *process);
185*1488St.nateldemoura@f5.com #endif
186248Svbart@nginx.com 
18720Sigor@sysoev.ru #if (NXT_HAVE_SETPROCTITLE)
1880Sigor@sysoev.ru 
18920Sigor@sysoev.ru #define nxt_process_title(task, fmt, ...)                                     \
19020Sigor@sysoev.ru     setproctitle(fmt, __VA_ARGS__)
19120Sigor@sysoev.ru 
19220Sigor@sysoev.ru #elif (NXT_LINUX || NXT_SOLARIS || NXT_MACOSX)
19320Sigor@sysoev.ru 
19420Sigor@sysoev.ru #define NXT_SETPROCTITLE_ARGV  1
19520Sigor@sysoev.ru NXT_EXPORT void nxt_process_title(nxt_task_t *task, const char *fmt, ...);
19620Sigor@sysoev.ru 
19720Sigor@sysoev.ru #endif
19820Sigor@sysoev.ru 
19920Sigor@sysoev.ru 
20020Sigor@sysoev.ru #define nxt_sched_yield()                                                     \
20120Sigor@sysoev.ru     sched_yield()
2020Sigor@sysoev.ru 
2030Sigor@sysoev.ru /*
2040Sigor@sysoev.ru  * Solaris declares abort() as __NORETURN,
2050Sigor@sysoev.ru  * raise(SIGABRT) is mostly the same.
2060Sigor@sysoev.ru  */
2070Sigor@sysoev.ru 
20820Sigor@sysoev.ru #define nxt_abort()                                                           \
2090Sigor@sysoev.ru     (void) raise(SIGABRT)
2100Sigor@sysoev.ru 
2110Sigor@sysoev.ru 
2120Sigor@sysoev.ru NXT_EXPORT extern nxt_pid_t  nxt_pid;
2130Sigor@sysoev.ru NXT_EXPORT extern nxt_pid_t  nxt_ppid;
2141306St.nateldemoura@f5.com NXT_EXPORT extern nxt_uid_t  nxt_euid;
2151306St.nateldemoura@f5.com NXT_EXPORT extern nxt_gid_t  nxt_egid;
2160Sigor@sysoev.ru NXT_EXPORT extern char       **nxt_process_argv;
2170Sigor@sysoev.ru NXT_EXPORT extern char       ***nxt_process_environ;
2180Sigor@sysoev.ru 
2190Sigor@sysoev.ru 
22020Sigor@sysoev.ru #endif /* _NXT_PROCESS_H_INCLUDED_ */
221