annotate src/os/win32/ngx_process.c @ 2745:1983932b8075

pass command lines options to workers
author Igor Sysoev <igor@sysoev.ru>
date Thu, 23 Apr 2009 18:22:28 +0000
parents d52cf82d0d77
children 3f287b615408
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
441
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 280
diff changeset
1
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 280
diff changeset
2 /*
444
42d11f017717 nginx-0.1.0-2004-09-29-20:00:49 import; remove years from copyright
Igor Sysoev <igor@sysoev.ru>
parents: 441
diff changeset
3 * Copyright (C) Igor Sysoev
441
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 280
diff changeset
4 */
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 280
diff changeset
5
278
0ba4821f4460 nginx-0.0.2-2004-03-04-10:04:55 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
6
0ba4821f4460 nginx-0.0.2-2004-03-04-10:04:55 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
7 #include <ngx_config.h>
0ba4821f4460 nginx-0.0.2-2004-03-04-10:04:55 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
8 #include <ngx_core.h>
0ba4821f4460 nginx-0.0.2-2004-03-04-10:04:55 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
9
0ba4821f4460 nginx-0.0.2-2004-03-04-10:04:55 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
10
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
11 int ngx_argc;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
12 char **ngx_argv;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
13 char **ngx_os_argv;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
14
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
15 ngx_int_t ngx_last_process;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
16 ngx_process_t ngx_processes[NGX_MAX_PROCESSES];
452
23fb87bddda1 nginx-0.1.1-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
17
23fb87bddda1 nginx-0.1.1-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
18
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
19 ngx_pid_t
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
20 ngx_spawn_process(ngx_cycle_t *cycle, char *name, ngx_int_t respawn)
278
0ba4821f4460 nginx-0.0.2-2004-03-04-10:04:55 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
21 {
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
22 u_long rc, n;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
23 ngx_int_t s;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
24 ngx_pid_t pid;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
25 ngx_exec_ctx_t ctx;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
26 char file[MAX_PATH + 1];
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
27
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
28 if (respawn >= 0) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
29 s = respawn;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
30
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
31 } else {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
32 for (s = 0; s < ngx_last_process; s++) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
33 if (ngx_processes[s].handle == NULL) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
34 break;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
35 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
36 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
37
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
38 if (s == NGX_MAX_PROCESSES) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
39 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
40 "no more than %d processes can be spawned",
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
41 NGX_MAX_PROCESSES);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
42 return NGX_INVALID_PID;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
43 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
44 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
45
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
46 n = GetModuleFileName(NULL, file, MAX_PATH);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
47
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
48 if (n == 0) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
49 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
50 "GetModuleFileName() failed");
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
51 return NGX_INVALID_PID;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
52 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
53
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
54 file[n] = '\0';
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
55
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
56 ngx_log_debug1(NGX_LOG_DEBUG_CORE, cycle->log, 0,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
57 "GetModuleFileName: \"%s\"", file);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
58
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
59 ctx.path = file;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
60 ctx.name = name;
2745
1983932b8075 pass command lines options to workers
Igor Sysoev <igor@sysoev.ru>
parents: 2737
diff changeset
61 ctx.args = GetCommandLine();
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
62 ctx.argv = NULL;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
63 ctx.envp = NULL;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
64
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
65 pid = ngx_execute(cycle, &ctx);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
66
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
67 if (pid == NGX_INVALID_PID) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
68 return pid;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
69 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
70
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
71 ngx_memzero(&ngx_processes[s], sizeof(ngx_process_t));
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
72
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
73 ngx_processes[s].handle = ctx.child;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
74 ngx_processes[s].pid = pid;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
75 ngx_processes[s].name = name;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
76
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
77 ngx_sprintf(ngx_processes[s].term_event, "ngx_%s_term_%ul%Z", name, pid);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
78 ngx_sprintf(ngx_processes[s].quit_event, "ngx_%s_quit_%ul%Z", name, pid);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
79 ngx_sprintf(ngx_processes[s].reopen_event, "ngx_%s_reopen_%ul%Z",
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
80 name, pid);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
81
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
82 rc = WaitForSingleObject(ngx_master_process_event, 5000);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
83
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
84 ngx_time_update(0, 0);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
85
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
86 ngx_log_debug1(NGX_LOG_DEBUG_CORE, cycle->log, 0,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
87 "WaitForSingleObject: %ul", rc);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
88
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
89 switch (rc) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
90
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
91 case WAIT_OBJECT_0:
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
92
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
93 ngx_processes[s].term = OpenEvent(EVENT_MODIFY_STATE, 0,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
94 (char *) ngx_processes[s].term_event);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
95 if (ngx_processes[s].term == NULL) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
96 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
97 "OpenEvent(\"%s\") failed",
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
98 ngx_processes[s].term_event);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
99 goto failed;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
100 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
101
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
102 ngx_processes[s].quit = OpenEvent(EVENT_MODIFY_STATE, 0,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
103 (char *) ngx_processes[s].quit_event);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
104 if (ngx_processes[s].quit == NULL) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
105 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
106 "OpenEvent(\"%s\") failed",
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
107 ngx_processes[s].quit_event);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
108 goto failed;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
109 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
110
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
111 ngx_processes[s].reopen = OpenEvent(EVENT_MODIFY_STATE, 0,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
112 (char *) ngx_processes[s].reopen_event);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
113 if (ngx_processes[s].reopen == NULL) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
114 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
115 "OpenEvent(\"%s\") failed",
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
116 ngx_processes[s].reopen_event);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
117 goto failed;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
118 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
119
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
120 if (ResetEvent(ngx_master_process_event) == 0) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
121 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
122 "ResetEvent(\"%s\") failed",
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
123 ngx_master_process_event_name);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
124 goto failed;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
125 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
126
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
127 break;
2737
d52cf82d0d77 style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 2725
diff changeset
128
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
129 case WAIT_TIMEOUT:
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
130 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
131 "the event \"%s\" was not signaled for 5s",
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
132 ngx_master_process_event_name);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
133 goto failed;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
134
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
135 case WAIT_FAILED:
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
136 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
137 "WaitForSingleObject(\"%s\") failed",
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
138 ngx_master_process_event_name);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
139
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
140 goto failed;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
141 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
142
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
143 if (respawn >= 0) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
144 return pid;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
145 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
146
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
147 switch (respawn) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
148
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
149 case NGX_PROCESS_RESPAWN:
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
150 ngx_processes[s].just_respawn = 0;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
151 break;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
152
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
153 case NGX_PROCESS_JUST_RESPAWN:
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
154 ngx_processes[s].just_respawn = 1;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
155 break;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
156 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
157
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
158 if (s == ngx_last_process) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
159 ngx_last_process++;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
160 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
161
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
162 return pid;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
163
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
164 failed:
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
165
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
166 if (ngx_processes[s].reopen) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
167 ngx_close_handle(ngx_processes[s].reopen);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
168 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
169
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
170 if (ngx_processes[s].quit) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
171 ngx_close_handle(ngx_processes[s].quit);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
172 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
173
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
174 if (ngx_processes[s].term) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
175 ngx_close_handle(ngx_processes[s].term);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
176 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
177
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
178 TerminateProcess(ngx_processes[s].handle, 2);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
179
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
180 if (ngx_processes[s].handle) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
181 ngx_close_handle(ngx_processes[s].handle);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
182 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
183
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
184 return NGX_INVALID_PID;
278
0ba4821f4460 nginx-0.0.2-2004-03-04-10:04:55 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
185 }
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
186
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
187
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
188 ngx_pid_t
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
189 ngx_execute(ngx_cycle_t *cycle, ngx_exec_ctx_t *ctx)
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
190 {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
191 STARTUPINFO si;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
192 PROCESS_INFORMATION pi;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
193
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
194 ngx_memzero(&si, sizeof(STARTUPINFO));
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
195 si.cb = sizeof(STARTUPINFO);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
196
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
197 ngx_memzero(&pi, sizeof(PROCESS_INFORMATION));
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
198
2745
1983932b8075 pass command lines options to workers
Igor Sysoev <igor@sysoev.ru>
parents: 2737
diff changeset
199 if (CreateProcess(ctx->path, ctx->args,
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
200 NULL, NULL, 0, CREATE_NO_WINDOW, NULL, NULL, &si, &pi)
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
201 == 0)
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
202 {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
203 ngx_log_error(NGX_LOG_CRIT, cycle->log, ngx_errno,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
204 "CreateProcess(\"%s\") failed", ngx_argv[0]);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
205
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
206 return 0;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
207 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
208
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
209 ctx->child = pi.hProcess;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
210
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
211 if (CloseHandle(pi.hThread) == 0) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
212 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
213 "CloseHandle(pi.hThread) failed");
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
214 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
215
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
216 ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
217 "start %s process %P", ctx->name, pi.dwProcessId);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
218
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
219 return pi.dwProcessId;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
220 }