summaryrefslogtreecommitdiffhomepage
path: root/src/os/unix
diff options
context:
space:
mode:
authorIgor Sysoev <igor@sysoev.ru>2010-06-07 10:35:08 +0000
committerIgor Sysoev <igor@sysoev.ru>2010-06-07 10:35:08 +0000
commite66eb15b7be2534c9405900eb7350b538a146905 (patch)
tree9fdde42dc4d05ce8b264225ba9c13ced6b3d8310 /src/os/unix
parentea3aaae636eb194e3dbbc5b9d0c0a51d831e2d4c (diff)
downloadnginx-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.h14
-rw-r--r--src/os/unix/ngx_process.c13
-rw-r--r--src/os/unix/ngx_process_cycle.c6
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();
}
}