Mercurial > hg > nginx
comparison src/event/modules/ngx_iocp_module.c @ 278:0ba4821f4460
nginx-0.0.2-2004-03-04-10:04:55 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Thu, 04 Mar 2004 07:04:55 +0000 |
parents | bdd631bf1a1c |
children | 7c7183b3ea8b |
comparison
equal
deleted
inserted
replaced
277:e91499541410 | 278:0ba4821f4460 |
---|---|
1 | 1 |
2 /* | 2 /* |
3 * Copyright (C) 2002-2003 Igor Sysoev, http://sysoev.ru | 3 * Copyright (C) 2002-2004 Igor Sysoev, http://sysoev.ru/en/ |
4 */ | 4 */ |
5 | 5 |
6 | 6 |
7 #include <ngx_config.h> | 7 #include <ngx_config.h> |
8 #include <ngx_core.h> | 8 #include <ngx_core.h> |
9 #include <ngx_event.h> | 9 #include <ngx_event.h> |
10 #include <ngx_iocp_module.h> | 10 #include <ngx_iocp_module.h> |
11 | 11 |
12 | 12 |
13 static int ngx_iocp_init(ngx_cycle_t *cycle); | 13 static ngx_int_t ngx_iocp_init(ngx_cycle_t *cycle); |
14 static void ngx_iocp_done(ngx_cycle_t *cycle); | 14 static void ngx_iocp_done(ngx_cycle_t *cycle); |
15 static int ngx_iocp_add_event(ngx_event_t *ev, int event, u_int key); | 15 static ngx_int_t ngx_iocp_add_event(ngx_event_t *ev, int event, u_int key); |
16 static int ngx_iocp_del_connection(ngx_connection_t *c, u_int flags); | 16 static ngx_int_t ngx_iocp_del_connection(ngx_connection_t *c, u_int flags); |
17 static int ngx_iocp_process_events(ngx_log_t *log); | 17 static ngx_int_t ngx_iocp_process_events(ngx_log_t *log); |
18 static void *ngx_iocp_create_conf(ngx_cycle_t *cycle); | 18 static void *ngx_iocp_create_conf(ngx_cycle_t *cycle); |
19 static char *ngx_iocp_init_conf(ngx_cycle_t *cycle, void *conf); | 19 static char *ngx_iocp_init_conf(ngx_cycle_t *cycle, void *conf); |
20 | 20 |
21 | 21 |
22 static ngx_str_t iocp_name = ngx_string("iocp"); | 22 static ngx_str_t iocp_name = ngx_string("iocp"); |
87 | 87 |
88 | 88 |
89 static HANDLE iocp; | 89 static HANDLE iocp; |
90 | 90 |
91 | 91 |
92 static int ngx_iocp_init(ngx_cycle_t *cycle) | 92 static ngx_int_t ngx_iocp_init(ngx_cycle_t *cycle) |
93 { | 93 { |
94 ngx_iocp_conf_t *cf; | 94 ngx_iocp_conf_t *cf; |
95 | 95 |
96 cf = ngx_event_get_conf(cycle->conf_ctx, ngx_iocp_module); | 96 cf = ngx_event_get_conf(cycle->conf_ctx, ngx_iocp_module); |
97 | 97 |
104 ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, | 104 ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, |
105 "CreateIoCompletionPort() failed"); | 105 "CreateIoCompletionPort() failed"); |
106 return NGX_ERROR; | 106 return NGX_ERROR; |
107 } | 107 } |
108 | 108 |
109 if (ngx_event_timer_init(cycle) == NGX_ERROR) { | |
110 return NGX_ERROR; | |
111 } | |
112 | |
113 ngx_io = ngx_iocp_io; | 109 ngx_io = ngx_iocp_io; |
114 | 110 |
115 ngx_event_actions = ngx_iocp_module_ctx.actions; | 111 ngx_event_actions = ngx_iocp_module_ctx.actions; |
116 | 112 |
117 ngx_event_flags = NGX_USE_AIO_EVENT|NGX_USE_IOCP_EVENT; | 113 ngx_event_flags = NGX_USE_AIO_EVENT|NGX_USE_IOCP_EVENT; |
126 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, | 122 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, |
127 "iocp CloseHandle() failed"); | 123 "iocp CloseHandle() failed"); |
128 } | 124 } |
129 | 125 |
130 iocp = NULL; | 126 iocp = NULL; |
131 | 127 } |
132 ngx_event_timer_done(cycle); | 128 |
133 } | 129 |
134 | 130 static ngx_int_t ngx_iocp_add_event(ngx_event_t *ev, int event, u_int key) |
135 | |
136 static int ngx_iocp_add_event(ngx_event_t *ev, int event, u_int key) | |
137 { | 131 { |
138 ngx_connection_t *c; | 132 ngx_connection_t *c; |
139 | 133 |
140 c = (ngx_connection_t *) ev->data; | 134 c = (ngx_connection_t *) ev->data; |
141 | 135 |
142 c->read->active = 1; | 136 c->read->active = 1; |
143 c->write->active = 1; | 137 c->write->active = 1; |
144 | 138 |
145 ngx_log_debug(ev->log, "iocp add: %d, %d:%08x" _ c->fd _ key _ &ev->ovlp); | 139 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, ev->log, 0, |
140 "iocp add: fd:%d k:%d ov:" PTR_FMT, c->fd, key, &ev->ovlp); | |
146 | 141 |
147 if (CreateIoCompletionPort((HANDLE) c->fd, iocp, key, 0) == NULL) { | 142 if (CreateIoCompletionPort((HANDLE) c->fd, iocp, key, 0) == NULL) { |
148 ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno, | 143 ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno, |
149 "CreateIoCompletionPort() failed"); | 144 "CreateIoCompletionPort() failed"); |
150 return NGX_ERROR; | 145 return NGX_ERROR; |
152 | 147 |
153 return NGX_OK; | 148 return NGX_OK; |
154 } | 149 } |
155 | 150 |
156 | 151 |
157 static int ngx_iocp_del_connection(ngx_connection_t *c, u_int flags) | 152 static ngx_int_t ngx_iocp_del_connection(ngx_connection_t *c, u_int flags) |
158 { | 153 { |
159 if (CancelIo((HANDLE) c->fd) == 0) { | 154 if (CancelIo((HANDLE) c->fd) == 0) { |
160 ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno, "CancelIo() failed"); | 155 ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno, "CancelIo() failed"); |
161 return NGX_ERROR; | 156 return NGX_ERROR; |
162 } | 157 } |
163 | 158 |
164 return NGX_OK; | 159 return NGX_OK; |
165 } | 160 } |
166 | 161 |
167 | 162 |
168 static int ngx_iocp_process_events(ngx_log_t *log) | 163 static ngx_int_t ngx_iocp_process_events(ngx_log_t *log) |
169 { | 164 { |
170 int rc; | 165 int rc; |
171 u_int key; | 166 u_int key; |
172 size_t bytes; | 167 size_t bytes; |
173 ngx_err_t err; | 168 ngx_err_t err; |
176 struct timeval tv; | 171 struct timeval tv; |
177 ngx_epoch_msec_t delta; | 172 ngx_epoch_msec_t delta; |
178 ngx_event_ovlp_t *ovlp; | 173 ngx_event_ovlp_t *ovlp; |
179 | 174 |
180 timer = ngx_event_find_timer(); | 175 timer = ngx_event_find_timer(); |
181 | 176 ngx_old_elapsed_msec = ngx_elapsed_msec; |
182 if (timer) { | 177 |
183 ngx_gettimeofday(&tv); | 178 if (timer == 0) { |
184 delta = tv.tv_sec * 1000 + tv.tv_usec / 1000; | |
185 | |
186 } else { | |
187 timer = INFINITE; | 179 timer = INFINITE; |
188 delta = 0; | 180 } |
189 } | 181 |
190 | 182 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0, "iocp timer: %d", timer); |
191 ngx_log_debug(log, "iocp timer: %d" _ timer); | |
192 | 183 |
193 rc = GetQueuedCompletionStatus(iocp, &bytes, (LPDWORD) &key, | 184 rc = GetQueuedCompletionStatus(iocp, &bytes, (LPDWORD) &key, |
194 (LPOVERLAPPED *) &ovlp, timer); | 185 (LPOVERLAPPED *) &ovlp, timer); |
195 | |
196 ngx_log_debug(log, "iocp: %d, %d, %d:%08x" _ rc _ bytes _ key _ ovlp); | |
197 | 186 |
198 if (rc == 0) { | 187 if (rc == 0) { |
199 err = ngx_errno; | 188 err = ngx_errno; |
200 } else { | 189 } else { |
201 err = 0; | 190 err = 0; |
202 } | 191 } |
203 | 192 |
204 ngx_gettimeofday(&tv); | 193 ngx_gettimeofday(&tv); |
205 | 194 ngx_time_update(tv.tv_sec); |
206 if (ngx_cached_time != tv.tv_sec) { | 195 |
207 ngx_cached_time = tv.tv_sec; | 196 ngx_log_debug4(NGX_LOG_DEBUG_EVENT, log, 0, |
208 ngx_time_update(); | 197 "iocp: %d b:%d k:%d ov:" PTR_FMT, rc, bytes, key, ovlp); |
209 } | 198 |
210 | 199 delta = ngx_elapsed_msec; |
211 if (timer != INFINITE) { | 200 ngx_elapsed_msec = tv.tv_sec * 1000 + tv.tv_usec / 1000 - ngx_start_msec; |
212 delta = tv.tv_sec * 1000 + tv.tv_usec / 1000 - delta; | |
213 ngx_event_expire_timers((ngx_msec_t) delta); | |
214 } | |
215 | 201 |
216 if (err) { | 202 if (err) { |
217 if (ovlp == NULL) { | 203 if (ovlp == NULL) { |
218 if (err != WAIT_TIMEOUT) { | 204 if (err != WAIT_TIMEOUT) { |
219 ngx_log_error(NGX_LOG_ALERT, log, err, | 205 ngx_log_error(NGX_LOG_ALERT, log, err, |
225 } else { | 211 } else { |
226 ovlp->error = err; | 212 ovlp->error = err; |
227 } | 213 } |
228 } | 214 } |
229 | 215 |
216 if (timer != INFINITE) { | |
217 delta = ngx_elapsed_msec - delta; | |
218 | |
219 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, log, 0, | |
220 "iocp timer: %d, delta: %d", timer, (int) delta); | |
221 } | |
222 | |
230 if (ovlp) { | 223 if (ovlp) { |
231 ev = ovlp->event; | 224 ev = ovlp->event; |
232 | 225 |
233 ngx_log_debug(log, "iocp ev: %08x" _ ev); | 226 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0, "iocp event:" PTR_FMT, ev); |
234 | 227 |
235 switch (key) { | 228 switch (key) { |
229 | |
236 case NGX_IOCP_ACCEPT: | 230 case NGX_IOCP_ACCEPT: |
237 if (bytes) { | 231 if (bytes) { |
238 ev->ready = 1; | 232 ev->ready = 1; |
239 } | 233 } |
240 break; | 234 break; |
248 ev->ready = 1; | 242 ev->ready = 1; |
249 } | 243 } |
250 | 244 |
251 ev->available = bytes; | 245 ev->available = bytes; |
252 | 246 |
253 ngx_log_debug(log, "iocp ev handler: %08x" _ ev->event_handler); | 247 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0, |
248 "iocp event handler: %08x" PTR_FMT, ev->event_handler); | |
254 | 249 |
255 ev->event_handler(ev); | 250 ev->event_handler(ev); |
251 } | |
252 | |
253 if (timer != INFINITE && delta) { | |
254 ngx_event_expire_timers((ngx_msec_t) delta); | |
256 } | 255 } |
257 | 256 |
258 return NGX_OK; | 257 return NGX_OK; |
259 } | 258 } |
260 | 259 |