annotate src/os/win32/ngx_process.c @ 7660:d33e17499088

Version bump.
author Maxim Dounin <mdounin@mdounin.ru>
date Tue, 26 May 2020 22:03:00 +0300
parents 7640d6c213e1
children
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
4412
d620f497c50f Copyright updated.
Maxim Konovalov <maxim@nginx.com>
parents: 3475
diff changeset
4 * Copyright (C) Nginx, Inc.
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
5 */
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
6
278
0ba4821f4460 nginx-0.0.2-2004-03-04-10:04:55 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
7
0ba4821f4460 nginx-0.0.2-2004-03-04-10:04:55 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
8 #include <ngx_config.h>
0ba4821f4460 nginx-0.0.2-2004-03-04-10:04:55 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
9 #include <ngx_core.h>
0ba4821f4460 nginx-0.0.2-2004-03-04-10:04:55 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
10
0ba4821f4460 nginx-0.0.2-2004-03-04-10:04:55 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
11
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
12 int ngx_argc;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
13 char **ngx_argv;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
14 char **ngx_os_argv;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
15
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
16 ngx_int_t ngx_last_process;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
17 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
18
23fb87bddda1 nginx-0.1.1-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
19
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
20 ngx_pid_t
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
21 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
22 {
2909
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
23 u_long rc, n, code;
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
24 ngx_int_t s;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
25 ngx_pid_t pid;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
26 ngx_exec_ctx_t ctx;
2909
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
27 HANDLE events[2];
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
28 char file[MAX_PATH + 1];
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
29
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
30 if (respawn >= 0) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
31 s = respawn;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
32
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
33 } else {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
34 for (s = 0; s < ngx_last_process; s++) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
35 if (ngx_processes[s].handle == NULL) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
36 break;
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 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
39
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
40 if (s == NGX_MAX_PROCESSES) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
41 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
42 "no more than %d processes can be spawned",
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
43 NGX_MAX_PROCESSES);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
44 return NGX_INVALID_PID;
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 }
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 n = GetModuleFileName(NULL, file, MAX_PATH);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
49
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
50 if (n == 0) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
51 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
52 "GetModuleFileName() failed");
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
53 return NGX_INVALID_PID;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
54 }
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 file[n] = '\0';
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
57
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
58 ngx_log_debug1(NGX_LOG_DEBUG_CORE, cycle->log, 0,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
59 "GetModuleFileName: \"%s\"", file);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
60
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
61 ctx.path = file;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
62 ctx.name = name;
2745
1983932b8075 pass command lines options to workers
Igor Sysoev <igor@sysoev.ru>
parents: 2737
diff changeset
63 ctx.args = GetCommandLine();
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
64 ctx.argv = NULL;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
65 ctx.envp = NULL;
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 pid = ngx_execute(cycle, &ctx);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
68
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
69 if (pid == NGX_INVALID_PID) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
70 return pid;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
71 }
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_memzero(&ngx_processes[s], sizeof(ngx_process_t));
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
74
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
75 ngx_processes[s].handle = ctx.child;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
76 ngx_processes[s].pid = pid;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
77 ngx_processes[s].name = name;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
78
6482
2b7dacb381ed Fixed ngx_pid_t formatting in ngx_sprintf() and logging.
Sergey Kandaurov <pluknet@nginx.com>
parents: 4757
diff changeset
79 ngx_sprintf(ngx_processes[s].term_event, "ngx_%s_term_%P%Z", name, pid);
2b7dacb381ed Fixed ngx_pid_t formatting in ngx_sprintf() and logging.
Sergey Kandaurov <pluknet@nginx.com>
parents: 4757
diff changeset
80 ngx_sprintf(ngx_processes[s].quit_event, "ngx_%s_quit_%P%Z", name, pid);
2b7dacb381ed Fixed ngx_pid_t formatting in ngx_sprintf() and logging.
Sergey Kandaurov <pluknet@nginx.com>
parents: 4757
diff changeset
81 ngx_sprintf(ngx_processes[s].reopen_event, "ngx_%s_reopen_%P%Z",
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
82 name, pid);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
83
2909
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
84 events[0] = ngx_master_process_event;
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
85 events[1] = ctx.child;
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
86
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
87 rc = WaitForMultipleObjects(2, events, 0, 5000);
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
88
3475
ab353d7dc182 *) introduce ngx_time_sigsafe_update() to update the error log time only
Igor Sysoev <igor@sysoev.ru>
parents: 3474
diff changeset
89 ngx_time_update();
2725
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 ngx_log_debug1(NGX_LOG_DEBUG_CORE, cycle->log, 0,
2909
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
92 "WaitForMultipleObjects: %ul", rc);
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
93
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
94 switch (rc) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
95
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
96 case WAIT_OBJECT_0:
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
97
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
98 ngx_processes[s].term = OpenEvent(EVENT_MODIFY_STATE, 0,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
99 (char *) ngx_processes[s].term_event);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
100 if (ngx_processes[s].term == NULL) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
101 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
102 "OpenEvent(\"%s\") failed",
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
103 ngx_processes[s].term_event);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
104 goto failed;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
105 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
106
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
107 ngx_processes[s].quit = OpenEvent(EVENT_MODIFY_STATE, 0,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
108 (char *) ngx_processes[s].quit_event);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
109 if (ngx_processes[s].quit == NULL) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
110 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
111 "OpenEvent(\"%s\") failed",
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
112 ngx_processes[s].quit_event);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
113 goto failed;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
114 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
115
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
116 ngx_processes[s].reopen = OpenEvent(EVENT_MODIFY_STATE, 0,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
117 (char *) ngx_processes[s].reopen_event);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
118 if (ngx_processes[s].reopen == NULL) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
119 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
120 "OpenEvent(\"%s\") failed",
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
121 ngx_processes[s].reopen_event);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
122 goto failed;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
123 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
124
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
125 if (ResetEvent(ngx_master_process_event) == 0) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
126 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
127 "ResetEvent(\"%s\") failed",
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
128 ngx_master_process_event_name);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
129 goto failed;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
130 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
131
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
132 break;
2737
d52cf82d0d77 style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 2725
diff changeset
133
2909
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
134 case WAIT_OBJECT_0 + 1:
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
135 if (GetExitCodeProcess(ctx.child, &code) == 0) {
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
136 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
137 "GetExitCodeProcess(%P) failed", pid);
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
138 }
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
139
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
140 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
6509
7640d6c213e1 Removed redundant "u" format specifier.
Ruslan Ermilov <ru@nginx.com>
parents: 6482
diff changeset
141 "%s process %P exited with code %Xl",
2909
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
142 name, pid, code);
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
143
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
144 goto failed;
3f287b615408 test premature process termination
Igor Sysoev <igor@sysoev.ru>
parents: 2745
diff changeset
145
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
146 case WAIT_TIMEOUT:
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
147 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
148 "the event \"%s\" was not signaled for 5s",
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
149 ngx_master_process_event_name);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
150 goto failed;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
151
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
152 case WAIT_FAILED:
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
153 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
154 "WaitForSingleObject(\"%s\") failed",
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
155 ngx_master_process_event_name);
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 goto failed;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
158 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
159
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
160 if (respawn >= 0) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
161 return pid;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
162 }
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 switch (respawn) {
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 case NGX_PROCESS_RESPAWN:
3016
d82993af1da0 introduce NGX_PROCESS_JUST_SPAWN and change field name accordingly
Igor Sysoev <igor@sysoev.ru>
parents: 2909
diff changeset
167 ngx_processes[s].just_spawn = 0;
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
168 break;
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 case NGX_PROCESS_JUST_RESPAWN:
3016
d82993af1da0 introduce NGX_PROCESS_JUST_SPAWN and change field name accordingly
Igor Sysoev <igor@sysoev.ru>
parents: 2909
diff changeset
171 ngx_processes[s].just_spawn = 1;
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
172 break;
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
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
175 if (s == ngx_last_process) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
176 ngx_last_process++;
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
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
179 return pid;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
180
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
181 failed:
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 if (ngx_processes[s].reopen) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
184 ngx_close_handle(ngx_processes[s].reopen);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
185 }
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 if (ngx_processes[s].quit) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
188 ngx_close_handle(ngx_processes[s].quit);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
189 }
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 if (ngx_processes[s].term) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
192 ngx_close_handle(ngx_processes[s].term);
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
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
195 TerminateProcess(ngx_processes[s].handle, 2);
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 if (ngx_processes[s].handle) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
198 ngx_close_handle(ngx_processes[s].handle);
4757
e00b71ece8b3 Win32: fixed cpu hog after process startup failure.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4412
diff changeset
199 ngx_processes[s].handle = NULL;
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
200 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
201
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
202 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
203 }
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
204
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 ngx_pid_t
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
207 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
208 {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
209 STARTUPINFO si;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
210 PROCESS_INFORMATION pi;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
211
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
212 ngx_memzero(&si, sizeof(STARTUPINFO));
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
213 si.cb = sizeof(STARTUPINFO);
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 ngx_memzero(&pi, sizeof(PROCESS_INFORMATION));
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
216
2745
1983932b8075 pass command lines options to workers
Igor Sysoev <igor@sysoev.ru>
parents: 2737
diff changeset
217 if (CreateProcess(ctx->path, ctx->args,
2725
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
218 NULL, NULL, 0, CREATE_NO_WINDOW, NULL, NULL, &si, &pi)
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
219 == 0)
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
220 {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
221 ngx_log_error(NGX_LOG_CRIT, cycle->log, ngx_errno,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
222 "CreateProcess(\"%s\") failed", ngx_argv[0]);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
223
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
224 return 0;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
225 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
226
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
227 ctx->child = pi.hProcess;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
228
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
229 if (CloseHandle(pi.hThread) == 0) {
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
230 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
231 "CloseHandle(pi.hThread) failed");
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
232 }
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
233
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
234 ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0,
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
235 "start %s process %P", ctx->name, pi.dwProcessId);
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
236
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
237 return pi.dwProcessId;
d43d73277c5c Win32 master/workers model
Igor Sysoev <igor@sysoev.ru>
parents: 452
diff changeset
238 }