Mercurial > hg > nginx
comparison src/os/win32/ngx_service.c @ 220:4f81b931e9ff
nginx-0.0.1-2004-01-08-11:47:17 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Thu, 08 Jan 2004 08:47:17 +0000 |
parents | |
children | da8c5707af39 |
comparison
equal
deleted
inserted
replaced
219:f57597ec5249 | 220:4f81b931e9ff |
---|---|
1 | |
2 #define NGX_SERVICE_CONTROL_SHUTDOWN 128 | |
3 #define NGX_SERVICE_CONTROL_REOPEN 129 | |
4 | |
5 | |
6 SERVICE_TABLE_ENTRY st[] = { | |
7 { "nginx", service_main }, | |
8 { NULL, NULL } | |
9 }; | |
10 | |
11 | |
12 ngx_int_t ngx_service(ngx_log_t *log) | |
13 { | |
14 /* primary thread */ | |
15 | |
16 /* StartServiceCtrlDispatcher() shouxpdl be called within 30 seconds */ | |
17 | |
18 if (StartServiceCtrlDispatcher(st) == 0) { | |
19 ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, | |
20 "StartServiceCtrlDispatcher() failed"); | |
21 return NGX_ERROR; | |
22 } | |
23 | |
24 return NGX_OK; | |
25 } | |
26 | |
27 | |
28 void service_main(u_int argc, char **argv) | |
29 { | |
30 SERVICE_STATUS status; | |
31 SERVICE_STATUS_HANDLE service; | |
32 | |
33 /* thread spawned by SCM */ | |
34 | |
35 service = RegisterServiceCtrlHandlerEx("nginx", service_handler, ctx); | |
36 if (service == INVALID_HANDLE_VALUE) { | |
37 ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, | |
38 "RegisterServiceCtrlHandlerEx() failed"); | |
39 return; | |
40 } | |
41 | |
42 status.dwServiceType = SERVICE_WIN32_OWN_PROCESS; | |
43 status.dwCurrentState = SERVICE_START_PENDING; | |
44 status.dwControlsAccepted = SERVICE_ACCEPT_STOP | |
45 |SERVICE_ACCEPT_PARAMCHANGE; | |
46 status.dwWin32ExitCode = NO_ERROR; | |
47 status.dwServiceSpecificExitCode = 0; | |
48 status.dwCheckPoint = 1; | |
49 status.dwWaitHint = 2000; | |
50 | |
51 /* SetServiceStatus() should be called within 80 seconds */ | |
52 | |
53 if (SetServiceStatus(service, &status) == 0) { | |
54 ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, | |
55 "SetServiceStatus() failed"); | |
56 return; | |
57 } | |
58 | |
59 /* init */ | |
60 | |
61 status.dwCurrentState = SERVICE_RUNNING; | |
62 status.dwCheckPoint = 0; | |
63 status.dwWaitHint = 0; | |
64 | |
65 if (SetServiceStatus(service, &status) == 0) { | |
66 ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, | |
67 "SetServiceStatus() failed"); | |
68 return; | |
69 } | |
70 | |
71 /* call master or worker loop */ | |
72 | |
73 /* | |
74 * master should use event notification and look status | |
75 * single should use iocp to get notifications from service handler | |
76 */ | |
77 | |
78 } | |
79 | |
80 | |
81 u_int service_handler(u_int control, u_int type, void *data, void *ctx) | |
82 { | |
83 /* primary thread */ | |
84 | |
85 switch(control) { | |
86 | |
87 case SERVICE_CONTROL_INTERROGATE: | |
88 status = NGX_IOCP_INTERROGATE; | |
89 break; | |
90 | |
91 case SERVICE_CONTROL_STOP: | |
92 status = NGX_IOCP_STOP; | |
93 break; | |
94 | |
95 case SERVICE_CONTROL_PARAMCHANGE: | |
96 status = NGX_IOCP_RECONFIGURE; | |
97 break; | |
98 | |
99 case NGX_SERVICE_CONTROL_SHUTDOWN: | |
100 status = NGX_IOCP_REOPEN; | |
101 break; | |
102 | |
103 case NGX_SERVICE_CONTROL_REOPEN: | |
104 status = NGX_IOCP_REOPEN; | |
105 break; | |
106 | |
107 default: | |
108 return ERROR_CALL_NOT_IMPLEMENTED; | |
109 } | |
110 | |
111 if (ngx_single) { | |
112 if (PostQueuedCompletionStatus(iocp, ... status, ...) == 0) { | |
113 err = ngx_errno; | |
114 ngx_log_error(NGX_LOG_ALERT, log, err, | |
115 "PostQueuedCompletionStatus() failed"); | |
116 return err; | |
117 } | |
118 | |
119 } else { | |
120 Event | |
121 } | |
122 | |
123 return NO_ERROR; | |
124 } |