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 }