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 #if (NXT_HAVE_CLONE) 11 #include <nxt_clone.h> 12 #endif 13 14 15 typedef pid_t nxt_pid_t; 16 17 18 typedef struct nxt_process_init_s nxt_process_init_t; 19 typedef nxt_int_t (*nxt_process_start_t)(nxt_task_t *task, void *data); 20 typedef nxt_int_t (*nxt_process_restart_t)(nxt_task_t *task, nxt_runtime_t *rt, 21 nxt_process_init_t *init); 22 23 struct nxt_process_init_s { 24 nxt_mp_t *mem_pool; 25 nxt_process_start_t start; 26 const char *name; 27 nxt_credential_t *user_cred; 28 29 const nxt_port_handlers_t *port_handlers; 30 const nxt_sig_event_t *signals; 31 32 nxt_process_type_t type; 33 34 void *data; 35 uint32_t stream; 36 37 union { 38 #if (NXT_HAVE_CLONE) 39 nxt_clone_t clone; 40 #endif 41 } isolation; 42 }; 43 44 45 typedef struct nxt_port_mmap_s nxt_port_mmap_t; 46 typedef struct nxt_port_mmaps_s nxt_port_mmaps_t; 47 48 struct nxt_port_mmaps_s { 49 nxt_thread_mutex_t mutex; 50 uint32_t size; 51 uint32_t cap; 52 nxt_port_mmap_t *elts; 53 }; 54 55 56 typedef struct { 57 nxt_pid_t pid; 58 nxt_queue_t ports; /* of nxt_port_t */ 59 nxt_bool_t ready; 60 nxt_bool_t registered; 61 nxt_int_t use_count; 62 63 nxt_process_init_t *init; 64 65 nxt_port_mmaps_t incoming; 66 nxt_port_mmaps_t outgoing; 67 68 nxt_thread_mutex_t cp_mutex; 69 nxt_lvlhsh_t connected_ports; /* of nxt_port_t */ 70 } nxt_process_t; 71 72 73 extern nxt_bool_t nxt_proc_conn_matrix[NXT_PROCESS_MAX][NXT_PROCESS_MAX]; 74 extern nxt_bool_t 75 nxt_proc_remove_notify_matrix[NXT_PROCESS_MAX][NXT_PROCESS_MAX]; 76 77 NXT_EXPORT nxt_pid_t nxt_process_create(nxt_task_t *task, 78 nxt_process_t *process); 79 NXT_EXPORT nxt_pid_t nxt_process_execute(nxt_task_t *task, char *name, 80 char **argv, char **envp); 81 NXT_EXPORT nxt_int_t nxt_process_daemon(nxt_task_t *task); 82 NXT_EXPORT void nxt_nanosleep(nxt_nsec_t ns); 83 84 NXT_EXPORT void nxt_process_arguments(nxt_task_t *task, char **orig_argv, 85 char ***orig_envp); 86 87 #define nxt_process_port_remove(port) \ 88 nxt_queue_remove(&port->link) 89 90 #define nxt_process_port_first(process) \ 91 nxt_queue_link_data(nxt_queue_first(&process->ports), nxt_port_t, link) 92 93 NXT_EXPORT void nxt_process_port_add(nxt_task_t *task, nxt_process_t *process, 94 nxt_port_t *port); 95 96 #define nxt_process_port_each(process, port) \ 97 nxt_queue_each(port, &process->ports, nxt_port_t, link) 98 99 #define nxt_process_port_loop \ 100 nxt_queue_loop 101 102 nxt_process_type_t nxt_process_type(nxt_process_t *process); 103 104 void nxt_process_use(nxt_task_t *task, nxt_process_t *process, int i); 105 106 void nxt_process_close_ports(nxt_task_t *task, nxt_process_t *process); 107 108 void nxt_process_connected_port_add(nxt_process_t *process, nxt_port_t *port); 109 110 void nxt_process_connected_port_remove(nxt_process_t *process, 111 nxt_port_t *port); 112 113 nxt_port_t *nxt_process_connected_port_find(nxt_process_t *process, 114 nxt_pid_t pid, nxt_port_id_t port_id); 115 116 void nxt_worker_process_quit_handler(nxt_task_t *task, 117 nxt_port_recv_msg_t *msg); 118 119 void nxt_init_destroy(nxt_runtime_t *rt, nxt_process_init_t *init); 120 121 122 #if (NXT_HAVE_SETPROCTITLE) 123 124 #define nxt_process_title(task, fmt, ...) \ 125 setproctitle(fmt, __VA_ARGS__) 126 127 #elif (NXT_LINUX || NXT_SOLARIS || NXT_MACOSX) 128 129 #define NXT_SETPROCTITLE_ARGV 1 130 NXT_EXPORT void nxt_process_title(nxt_task_t *task, const char *fmt, ...); 131 132 #endif 133 134 135 #define nxt_sched_yield() \ 136 sched_yield() 137 138 /* 139 * Solaris declares abort() as __NORETURN, 140 * raise(SIGABRT) is mostly the same. 141 */ 142 143 #define nxt_abort() \ 144 (void) raise(SIGABRT) 145 146 147 NXT_EXPORT extern nxt_pid_t nxt_pid; 148 NXT_EXPORT extern nxt_pid_t nxt_ppid; 149 NXT_EXPORT extern nxt_uid_t nxt_euid; 150 NXT_EXPORT extern nxt_gid_t nxt_egid; 151 NXT_EXPORT extern char **nxt_process_argv; 152 NXT_EXPORT extern char ***nxt_process_environ; 153 154 155 #endif /* _NXT_PROCESS_H_INCLUDED_ */ 156