comparison src/event/modules/ngx_iocp_module.c @ 557:ecd9c160f25b release-0.3.0

nginx-0.3.0-RELEASE import *) Change: the 10-days live time limit of worker process was eliminated. The limit was introduced because of millisecond timers overflow.
author Igor Sysoev <igor@sysoev.ru>
date Fri, 07 Oct 2005 13:30:52 +0000
parents b09ee85d0ac8
children 9c2f3ed7a247
comparison
equal deleted inserted replaced
556:21a706ff4e1f 557:ecd9c160f25b
182 { 182 {
183 int rc; 183 int rc;
184 u_int key; 184 u_int key;
185 u_long bytes; 185 u_long bytes;
186 ngx_err_t err; 186 ngx_err_t err;
187 ngx_msec_t timer; 187 ngx_msec_t timer, delta;
188 ngx_event_t *ev; 188 ngx_event_t *ev;
189 struct timeval tv; 189 struct timeval tv;
190 ngx_epoch_msec_t delta;
191 ngx_event_ovlp_t *ovlp; 190 ngx_event_ovlp_t *ovlp;
192 191
193 timer = ngx_event_find_timer(); 192 timer = ngx_event_find_timer();
194 ngx_old_elapsed_msec = ngx_elapsed_msec; 193
195 194 if (timer == NGX_TIMER_INFINITE) {
196 if (timer == 0) {
197 timer = INFINITE; 195 timer = INFINITE;
198 } 196 }
199 197
200 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "iocp timer: %d", timer); 198 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "iocp timer: %M", timer);
201 199
202 rc = GetQueuedCompletionStatus(iocp, &bytes, (LPDWORD) &key, 200 rc = GetQueuedCompletionStatus(iocp, &bytes, (LPDWORD) &key,
203 (LPOVERLAPPED *) &ovlp, timer); 201 (LPOVERLAPPED *) &ovlp, (u_long) timer);
204 202
205 if (rc == 0) { 203 if (rc == 0) {
206 err = ngx_errno; 204 err = ngx_errno;
207 } else { 205 } else {
208 err = 0; 206 err = 0;
212 ngx_time_update(tv.tv_sec); 210 ngx_time_update(tv.tv_sec);
213 211
214 ngx_log_debug4(NGX_LOG_DEBUG_EVENT, cycle->log, 0, 212 ngx_log_debug4(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
215 "iocp: %d b:%d k:%d ov:%p", rc, bytes, key, ovlp); 213 "iocp: %d b:%d k:%d ov:%p", rc, bytes, key, ovlp);
216 214
217 delta = ngx_elapsed_msec; 215 delta = ngx_current_time;
218 ngx_elapsed_msec = (ngx_epoch_msec_t) tv.tv_sec * 1000 216 ngx_current_time = (ngx_msec_t) tv.tv_sec * 1000 + tv.tv_usec / 1000;
219 + tv.tv_usec / 1000 - ngx_start_msec;
220 217
221 if (timer != INFINITE) { 218 if (timer != INFINITE) {
222 delta = ngx_elapsed_msec - delta; 219 delta = ngx_current_time - delta;
223 220
224 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0, 221 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
225 "iocp timer: %d, delta: %d", timer, (int) delta); 222 "iocp timer: %M, delta: %M", timer, delta);
226 } 223 }
227 224
228 if (err) { 225 if (err) {
229 if (ovlp == NULL) { 226 if (ovlp == NULL) {
230 if (err != WAIT_TIMEOUT) { 227 if (err != WAIT_TIMEOUT) {
232 "GetQueuedCompletionStatus() failed"); 229 "GetQueuedCompletionStatus() failed");
233 230
234 return NGX_ERROR; 231 return NGX_ERROR;
235 } 232 }
236 233
237 if (timer != INFINITE && delta) { 234 ngx_event_expire_timers();
238 ngx_event_expire_timers((ngx_msec_t) delta);
239 }
240 235
241 return NGX_OK; 236 return NGX_OK;
242 } 237 }
243 238
244 ovlp->error = err; 239 ovlp->error = err;
266 */ 261 */
267 262
268 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, err, 263 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, err,
269 "iocp: aborted event %p", ev); 264 "iocp: aborted event %p", ev);
270 265
271 if (timer != INFINITE && delta) { 266 ngx_event_expire_timers();
272 ngx_event_expire_timers((ngx_msec_t) delta);
273 }
274 267
275 return NGX_OK; 268 return NGX_OK;
276 } 269 }
277 270
278 if (err) { 271 if (err) {
302 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, 295 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
303 "iocp event handler: %p", ev->handler); 296 "iocp event handler: %p", ev->handler);
304 297
305 ev->handler(ev); 298 ev->handler(ev);
306 299
307 if (timer != INFINITE && delta) { 300 ngx_event_expire_timers();
308 ngx_event_expire_timers((ngx_msec_t) delta);
309 }
310 301
311 return NGX_OK; 302 return NGX_OK;
312 } 303 }
313 304
314 305