nxt_process.h (320:d385755599d6) nxt_process.h (341:5e1a9c009968)
1
2/*
3 * Copyright (C) Igor Sysoev
4 * Copyright (C) NGINX, Inc.
5 */
6
7#ifndef _NXT_PROCESS_H_INCLUDED_
8#define _NXT_PROCESS_H_INCLUDED_
9
10
11typedef pid_t nxt_pid_t;
12typedef uid_t nxt_uid_t;
13typedef gid_t nxt_gid_t;
14
15
16typedef struct {
17 const char *user;
18 nxt_uid_t uid;
19 nxt_gid_t base_gid;
20 nxt_uint_t ngroups;
21 nxt_gid_t *gids;
22} nxt_user_cred_t;
23
24typedef struct nxt_process_init_s nxt_process_init_t;
25typedef nxt_int_t (*nxt_process_start_t)(nxt_task_t *task, void *data);
26
27
28struct nxt_process_init_s {
29 nxt_process_start_t start;
30 const char *name;
31 nxt_user_cred_t *user_cred;
32
33 nxt_port_handlers_t *port_handlers;
34 const nxt_sig_event_t *signals;
35
36 nxt_process_type_t type;
37
38 void *data;
39 uint32_t stream;
40
41 nxt_bool_t restart;
42};
43
44
45typedef struct {
46 nxt_pid_t pid;
47 nxt_queue_t ports; /* of nxt_port_t */
48 nxt_bool_t ready;
49 nxt_bool_t registered;
50 nxt_uint_t port_cleanups;
51
52 nxt_process_init_t *init;
53
54 nxt_thread_mutex_t incoming_mutex;
55 nxt_array_t *incoming; /* of nxt_port_mmap_t */
56
57 nxt_thread_mutex_t outgoing_mutex;
58 nxt_array_t *outgoing; /* of nxt_port_mmap_t */
59
60 nxt_thread_mutex_t cp_mutex;
1
2/*
3 * Copyright (C) Igor Sysoev
4 * Copyright (C) NGINX, Inc.
5 */
6
7#ifndef _NXT_PROCESS_H_INCLUDED_
8#define _NXT_PROCESS_H_INCLUDED_
9
10
11typedef pid_t nxt_pid_t;
12typedef uid_t nxt_uid_t;
13typedef gid_t nxt_gid_t;
14
15
16typedef struct {
17 const char *user;
18 nxt_uid_t uid;
19 nxt_gid_t base_gid;
20 nxt_uint_t ngroups;
21 nxt_gid_t *gids;
22} nxt_user_cred_t;
23
24typedef struct nxt_process_init_s nxt_process_init_t;
25typedef nxt_int_t (*nxt_process_start_t)(nxt_task_t *task, void *data);
26
27
28struct nxt_process_init_s {
29 nxt_process_start_t start;
30 const char *name;
31 nxt_user_cred_t *user_cred;
32
33 nxt_port_handlers_t *port_handlers;
34 const nxt_sig_event_t *signals;
35
36 nxt_process_type_t type;
37
38 void *data;
39 uint32_t stream;
40
41 nxt_bool_t restart;
42};
43
44
45typedef struct {
46 nxt_pid_t pid;
47 nxt_queue_t ports; /* of nxt_port_t */
48 nxt_bool_t ready;
49 nxt_bool_t registered;
50 nxt_uint_t port_cleanups;
51
52 nxt_process_init_t *init;
53
54 nxt_thread_mutex_t incoming_mutex;
55 nxt_array_t *incoming; /* of nxt_port_mmap_t */
56
57 nxt_thread_mutex_t outgoing_mutex;
58 nxt_array_t *outgoing; /* of nxt_port_mmap_t */
59
60 nxt_thread_mutex_t cp_mutex;
61 nxt_mp_t *cp_mem_pool;
62 nxt_lvlhsh_t connected_ports; /* of nxt_port_t */
63} nxt_process_t;
64
65
66NXT_EXPORT nxt_pid_t nxt_process_create(nxt_task_t *task,
67 nxt_process_t *process);
68NXT_EXPORT nxt_pid_t nxt_process_execute(nxt_task_t *task, char *name,
69 char **argv, char **envp);
70NXT_EXPORT nxt_int_t nxt_process_daemon(nxt_task_t *task);
71NXT_EXPORT void nxt_nanosleep(nxt_nsec_t ns);
72
73NXT_EXPORT void nxt_process_arguments(nxt_task_t *task, char **orig_argv,
74 char ***orig_envp);
75
76#define nxt_process_port_remove(port) \
77 nxt_queue_remove(&port->link)
78
79#define nxt_process_port_first(process) \
80 nxt_queue_link_data(nxt_queue_first(&process->ports), nxt_port_t, link)
81
82NXT_EXPORT void nxt_process_port_add(nxt_task_t *task, nxt_process_t *process,
83 nxt_port_t *port);
84
85#define nxt_process_port_each(process, port) \
86 nxt_queue_each(port, &process->ports, nxt_port_t, link)
87
88#define nxt_process_port_loop \
89 nxt_queue_loop
90
91
92void nxt_process_connected_port_add(nxt_process_t *process, nxt_port_t *port);
93
94void nxt_process_connected_port_remove(nxt_process_t *process,
95 nxt_port_t *port);
96
97nxt_port_t *nxt_process_connected_port_find(nxt_process_t *process,
98 nxt_pid_t pid, nxt_port_id_t port_id);
99
100
101void nxt_worker_process_quit_handler(nxt_task_t *task,
102 nxt_port_recv_msg_t *msg);
103
104
105#if (NXT_HAVE_SETPROCTITLE)
106
107#define nxt_process_title(task, fmt, ...) \
108 setproctitle(fmt, __VA_ARGS__)
109
110#elif (NXT_LINUX || NXT_SOLARIS || NXT_MACOSX)
111
112#define NXT_SETPROCTITLE_ARGV 1
113NXT_EXPORT void nxt_process_title(nxt_task_t *task, const char *fmt, ...);
114
115#endif
116
117
118#define nxt_sched_yield() \
119 sched_yield()
120
121/*
122 * Solaris declares abort() as __NORETURN,
123 * raise(SIGABRT) is mostly the same.
124 */
125
126#define nxt_abort() \
127 (void) raise(SIGABRT)
128
129NXT_EXPORT nxt_int_t nxt_user_cred_get(nxt_task_t *task, nxt_user_cred_t *uc,
130 const char *group);
131NXT_EXPORT nxt_int_t nxt_user_cred_set(nxt_task_t *task, nxt_user_cred_t *uc);
132
133NXT_EXPORT extern nxt_pid_t nxt_pid;
134NXT_EXPORT extern nxt_pid_t nxt_ppid;
135NXT_EXPORT extern char **nxt_process_argv;
136NXT_EXPORT extern char ***nxt_process_environ;
137
138
139#endif /* _NXT_PROCESS_H_INCLUDED_ */
61 nxt_lvlhsh_t connected_ports; /* of nxt_port_t */
62} nxt_process_t;
63
64
65NXT_EXPORT nxt_pid_t nxt_process_create(nxt_task_t *task,
66 nxt_process_t *process);
67NXT_EXPORT nxt_pid_t nxt_process_execute(nxt_task_t *task, char *name,
68 char **argv, char **envp);
69NXT_EXPORT nxt_int_t nxt_process_daemon(nxt_task_t *task);
70NXT_EXPORT void nxt_nanosleep(nxt_nsec_t ns);
71
72NXT_EXPORT void nxt_process_arguments(nxt_task_t *task, char **orig_argv,
73 char ***orig_envp);
74
75#define nxt_process_port_remove(port) \
76 nxt_queue_remove(&port->link)
77
78#define nxt_process_port_first(process) \
79 nxt_queue_link_data(nxt_queue_first(&process->ports), nxt_port_t, link)
80
81NXT_EXPORT void nxt_process_port_add(nxt_task_t *task, nxt_process_t *process,
82 nxt_port_t *port);
83
84#define nxt_process_port_each(process, port) \
85 nxt_queue_each(port, &process->ports, nxt_port_t, link)
86
87#define nxt_process_port_loop \
88 nxt_queue_loop
89
90
91void nxt_process_connected_port_add(nxt_process_t *process, nxt_port_t *port);
92
93void nxt_process_connected_port_remove(nxt_process_t *process,
94 nxt_port_t *port);
95
96nxt_port_t *nxt_process_connected_port_find(nxt_process_t *process,
97 nxt_pid_t pid, nxt_port_id_t port_id);
98
99
100void nxt_worker_process_quit_handler(nxt_task_t *task,
101 nxt_port_recv_msg_t *msg);
102
103
104#if (NXT_HAVE_SETPROCTITLE)
105
106#define nxt_process_title(task, fmt, ...) \
107 setproctitle(fmt, __VA_ARGS__)
108
109#elif (NXT_LINUX || NXT_SOLARIS || NXT_MACOSX)
110
111#define NXT_SETPROCTITLE_ARGV 1
112NXT_EXPORT void nxt_process_title(nxt_task_t *task, const char *fmt, ...);
113
114#endif
115
116
117#define nxt_sched_yield() \
118 sched_yield()
119
120/*
121 * Solaris declares abort() as __NORETURN,
122 * raise(SIGABRT) is mostly the same.
123 */
124
125#define nxt_abort() \
126 (void) raise(SIGABRT)
127
128NXT_EXPORT nxt_int_t nxt_user_cred_get(nxt_task_t *task, nxt_user_cred_t *uc,
129 const char *group);
130NXT_EXPORT nxt_int_t nxt_user_cred_set(nxt_task_t *task, nxt_user_cred_t *uc);
131
132NXT_EXPORT extern nxt_pid_t nxt_pid;
133NXT_EXPORT extern nxt_pid_t nxt_ppid;
134NXT_EXPORT extern char **nxt_process_argv;
135NXT_EXPORT extern char ***nxt_process_environ;
136
137
138#endif /* _NXT_PROCESS_H_INCLUDED_ */