Mercurial > hg > nginx-ranges
comparison src/event/modules/ngx_rtsig_module.c @ 106:45f7329b4bd0 NGINX_0_3_0
nginx 0.3.0
*) Change: the 10-days live time limit of worker process was
eliminated. The limit was introduced because of millisecond timers
overflow.
author | Igor Sysoev <http://sysoev.ru> |
---|---|
date | Fri, 07 Oct 2005 00:00:00 +0400 |
parents | d6800bbe720e |
children | cf3d6edb3ad6 |
comparison
equal
deleted
inserted
replaced
105:531d62c2a28d | 106:45f7329b4bd0 |
---|---|
281 static ngx_int_t | 281 static ngx_int_t |
282 ngx_rtsig_process_events(ngx_cycle_t *cycle) | 282 ngx_rtsig_process_events(ngx_cycle_t *cycle) |
283 { | 283 { |
284 int signo; | 284 int signo; |
285 ngx_int_t instance; | 285 ngx_int_t instance; |
286 ngx_uint_t expire; | 286 ngx_msec_t timer, delta; |
287 ngx_msec_t timer; | |
288 ngx_err_t err; | 287 ngx_err_t err; |
289 siginfo_t si; | 288 siginfo_t si; |
290 ngx_event_t *rev, *wev; | 289 ngx_event_t *rev, *wev; |
291 struct timeval tv; | 290 struct timeval tv; |
292 struct timespec ts, *tp; | 291 struct timespec ts, *tp; |
293 struct sigaction sa; | 292 struct sigaction sa; |
294 ngx_epoch_msec_t delta; | |
295 ngx_connection_t *c; | 293 ngx_connection_t *c; |
296 ngx_rtsig_conf_t *rtscf; | 294 ngx_rtsig_conf_t *rtscf; |
297 | 295 |
298 if (overflow) { | 296 if (overflow) { |
299 timer = 0; | 297 timer = 0; |
300 expire = 0; | |
301 | 298 |
302 } else { | 299 } else { |
303 for ( ;; ) { | 300 timer = ngx_event_find_timer(); |
304 timer = ngx_event_find_timer(); | |
305 | 301 |
306 #if (NGX_THREADS) | 302 #if (NGX_THREADS) |
307 | 303 |
308 if (timer == NGX_TIMER_ERROR) { | 304 if (timer == NGX_TIMER_ERROR) { |
309 return NGX_ERROR; | 305 return NGX_ERROR; |
310 } | 306 } |
311 | 307 |
312 if (timer == NGX_TIMER_INFINITE || timer > 500) { | 308 if (timer == NGX_TIMER_INFINITE || timer > 500) { |
313 timer = 500; | 309 timer = 500; |
314 break; | 310 break; |
315 } | 311 } |
316 | 312 |
317 #endif | 313 #endif |
318 | |
319 if (timer != 0) { | |
320 break; | |
321 } | |
322 | |
323 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, | |
324 "rtsig expired timer"); | |
325 | |
326 ngx_event_expire_timers((ngx_msec_t) | |
327 (ngx_elapsed_msec - ngx_old_elapsed_msec)); | |
328 | |
329 if (ngx_posted_events && ngx_threaded) { | |
330 ngx_wakeup_worker_thread(cycle); | |
331 } | |
332 } | |
333 | |
334 expire = 1; | |
335 | 314 |
336 if (ngx_accept_mutex) { | 315 if (ngx_accept_mutex) { |
337 if (ngx_accept_disabled > 0) { | 316 if (ngx_accept_disabled > 0) { |
338 ngx_accept_disabled--; | 317 ngx_accept_disabled--; |
339 | 318 |
347 if (ngx_accept_mutex_held == 0 | 326 if (ngx_accept_mutex_held == 0 |
348 && (timer == NGX_TIMER_INFINITE | 327 && (timer == NGX_TIMER_INFINITE |
349 || timer > ngx_accept_mutex_delay)) | 328 || timer > ngx_accept_mutex_delay)) |
350 { | 329 { |
351 timer = ngx_accept_mutex_delay; | 330 timer = ngx_accept_mutex_delay; |
352 expire = 0; | |
353 } | 331 } |
354 } | 332 } |
355 } | 333 } |
356 } | 334 } |
357 | 335 |
358 if (timer == NGX_TIMER_INFINITE) { | 336 if (timer == NGX_TIMER_INFINITE) { |
359 tp = NULL; | 337 tp = NULL; |
360 expire = 0; | |
361 | 338 |
362 } else { | 339 } else { |
363 ts.tv_sec = timer / 1000; | 340 ts.tv_sec = timer / 1000; |
364 ts.tv_nsec = (timer % 1000) * 1000000; | 341 ts.tv_nsec = (timer % 1000) * 1000000; |
365 tp = &ts; | 342 tp = &ts; |
366 } | 343 } |
367 | 344 |
368 ngx_old_elapsed_msec = ngx_elapsed_msec; | |
369 | |
370 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, | 345 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, |
371 "rtsig timer: %d", timer); | 346 "rtsig timer: %M", timer); |
372 | 347 |
373 /* Linux's sigwaitinfo() is sigtimedwait() with the NULL timeout pointer */ | 348 /* Linux's sigwaitinfo() is sigtimedwait() with the NULL timeout pointer */ |
374 | 349 |
375 signo = sigtimedwait(&set, &si, tp); | 350 signo = sigtimedwait(&set, &si, tp); |
376 | 351 |
400 } | 375 } |
401 | 376 |
402 ngx_gettimeofday(&tv); | 377 ngx_gettimeofday(&tv); |
403 ngx_time_update(tv.tv_sec); | 378 ngx_time_update(tv.tv_sec); |
404 | 379 |
405 delta = ngx_elapsed_msec; | 380 delta = ngx_current_time; |
406 ngx_elapsed_msec = (ngx_epoch_msec_t) tv.tv_sec * 1000 | 381 ngx_current_time = (ngx_msec_t) tv.tv_sec * 1000 + tv.tv_usec / 1000; |
407 + tv.tv_usec / 1000 - ngx_start_msec; | |
408 | 382 |
409 if (err) { | 383 if (err) { |
410 ngx_accept_mutex_unlock(); | 384 ngx_accept_mutex_unlock(); |
411 ngx_log_error((err == NGX_EINTR) ? NGX_LOG_INFO : NGX_LOG_ALERT, | 385 ngx_log_error((err == NGX_EINTR) ? NGX_LOG_INFO : NGX_LOG_ALERT, |
412 cycle->log, err, "sigtimedwait() failed"); | 386 cycle->log, err, "sigtimedwait() failed"); |
413 return NGX_ERROR; | 387 return NGX_ERROR; |
414 } | 388 } |
415 | 389 |
416 if (timer != NGX_TIMER_INFINITE) { | 390 if (timer != NGX_TIMER_INFINITE) { |
417 delta = ngx_elapsed_msec - delta; | 391 delta = ngx_current_time - delta; |
418 | 392 |
419 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0, | 393 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0, |
420 "rtsig timer: %d, delta: %d", timer, (int) delta); | 394 "rtsig timer: %M, delta: %M", timer, delta); |
421 } | 395 } |
422 | 396 |
423 rtscf = ngx_event_get_conf(ngx_cycle->conf_ctx, ngx_rtsig_module); | 397 rtscf = ngx_event_get_conf(ngx_cycle->conf_ctx, ngx_rtsig_module); |
424 | 398 |
425 if (signo == rtscf->signo || signo == rtscf->signo + 1) { | 399 if (signo == rtscf->signo || signo == rtscf->signo + 1) { |
555 return NGX_ERROR; | 529 return NGX_ERROR; |
556 } | 530 } |
557 | 531 |
558 ngx_accept_mutex_unlock(); | 532 ngx_accept_mutex_unlock(); |
559 | 533 |
560 if (expire && delta) { | 534 ngx_event_expire_timers(); |
561 ngx_event_expire_timers((ngx_msec_t) delta); | |
562 } | |
563 | 535 |
564 if (ngx_posted_events) { | 536 if (ngx_posted_events) { |
565 if (ngx_threaded) { | 537 if (ngx_threaded) { |
566 ngx_wakeup_worker_thread(cycle); | 538 ngx_wakeup_worker_thread(cycle); |
567 | 539 |