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