diff options
| author | Igor Sysoev <igor@sysoev.ru> | 2010-06-07 10:35:08 +0000 |
|---|---|---|
| committer | Igor Sysoev <igor@sysoev.ru> | 2010-06-07 10:35:08 +0000 |
| commit | e66eb15b7be2534c9405900eb7350b538a146905 (patch) | |
| tree | 9fdde42dc4d05ce8b264225ba9c13ced6b3d8310 /src/os/unix | |
| parent | ea3aaae636eb194e3dbbc5b9d0c0a51d831e2d4c (diff) | |
| download | nginx-e66eb15b7be2534c9405900eb7350b538a146905.tar.gz nginx-e66eb15b7be2534c9405900eb7350b538a146905.tar.bz2 | |
merge r3473, r3474, r3385, r3386, r3537:
signal processing stability:
*) use sys_errlist[] in signal handler instead
of non Async-Signal-Safe strerror_r()
*) do not update time in the timer signal handler,
since localtime_r() is not Async-Signal-Safe function
*) use previously cached GMT offset value to update time from a signal handler
*) change ngx_time_update() interface since there are no notification methods
those return time
*) introduce ngx_time_sigsafe_update() to update the error log time only
*) change ngx_time_update() interface
Diffstat (limited to '')
| -rw-r--r-- | src/os/unix/ngx_errno.h | 14 | ||||
| -rw-r--r-- | src/os/unix/ngx_process.c | 13 | ||||
| -rw-r--r-- | src/os/unix/ngx_process_cycle.c | 6 |
3 files changed, 23 insertions, 10 deletions
diff --git a/src/os/unix/ngx_errno.h b/src/os/unix/ngx_errno.h index 379f36777..ddc2b2761 100644 --- a/src/os/unix/ngx_errno.h +++ b/src/os/unix/ngx_errno.h @@ -64,10 +64,22 @@ u_char *ngx_strerror_r(int err, u_char *errstr, size_t size); /* Solaris and Tru64 UNIX have thread-safe strerror() */ -#define ngx_strerror_r(err, errstr, size) \ +#define ngx_strerror_r(err, errstr, size) \ ngx_cpystrn(errstr, (u_char *) strerror(err), size) #endif +#if (NGX_HAVE_SYS_ERRLIST) + +#define ngx_sigsafe_strerror(err) \ + (err > 0 && err < sys_nerr) ? sys_errlist[err] : "Unknown error" + +#else + +#define ngx_sigsafe_strerror(err) "" + +#endif + + #endif /* _NGX_ERRNO_H_INCLUDED_ */ diff --git a/src/os/unix/ngx_process.c b/src/os/unix/ngx_process.c index 21a92f178..5e230f5bb 100644 --- a/src/os/unix/ngx_process.c +++ b/src/os/unix/ngx_process.c @@ -315,7 +315,7 @@ ngx_signal_handler(int signo) } } - ngx_time_update(0, 0); + ngx_time_sigsafe_update(); action = ""; @@ -476,16 +476,17 @@ ngx_process_get_status(void) */ if (err == NGX_ECHILD) { - ngx_log_error(NGX_LOG_INFO, ngx_cycle->log, errno, - "waitpid() failed"); + ngx_log_error(NGX_LOG_INFO, ngx_cycle->log, 0, + "waitpid() failed (%d: %s)", + err, ngx_sigsafe_strerror(err)); return; } #endif - ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, errno, - "waitpid() failed"); - + ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0, + "waitpid() failed (%d: %s)", + err, ngx_sigsafe_strerror(err)); return; } diff --git a/src/os/unix/ngx_process_cycle.c b/src/os/unix/ngx_process_cycle.c index e3b054834..812b36fc4 100644 --- a/src/os/unix/ngx_process_cycle.c +++ b/src/os/unix/ngx_process_cycle.c @@ -168,7 +168,7 @@ ngx_master_process_cycle(ngx_cycle_t *cycle) sigsuspend(&set); - ngx_time_update(0, 0); + ngx_time_update(); ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "wake up, sigio %i", sigio); @@ -1337,7 +1337,7 @@ ngx_cache_manager_process_handler(ngx_event_t *ev) next = (n <= next) ? n : next; - ngx_time_update(0, 0); + ngx_time_update(); } } @@ -1367,7 +1367,7 @@ ngx_cache_loader_process_handler(ngx_event_t *ev) if (path[i]->loader) { path[i]->loader(path[i]->data); - ngx_time_update(0, 0); + ngx_time_update(); } } |
