--- /dev/null
+--- server/mpm/prefork/prefork.c 2009/01/31 20:53:11 739607
++++ server/mpm/prefork/prefork.c 2009/01/31 20:54:55 739608
+@@ -577,19 +577,27 @@
+ apr_int32_t numdesc;
+ const apr_pollfd_t *pdesc;
+
+- /* timeout == -1 == wait forever */
+- status = apr_pollset_poll(pollset, -1, &numdesc, &pdesc);
++ /* check for termination first so we don't sleep for a while in
++ * poll if already signalled
++ */
++ if (one_process && shutdown_pending) {
++ SAFE_ACCEPT(accept_mutex_off());
++ return;
++ }
++ else if (die_now) {
++ /* In graceful stop/restart; drop the mutex
++ * and terminate the child. */
++ SAFE_ACCEPT(accept_mutex_off());
++ clean_child_exit(0);
++ }
++ /* timeout == 10 seconds to avoid a hang at graceful restart/stop
++ * caused by the closing of sockets by the signal handler
++ */
++ status = apr_pollset_poll(pollset, apr_time_from_sec(10),
++ &numdesc, &pdesc);
+ if (status != APR_SUCCESS) {
+- if (APR_STATUS_IS_EINTR(status)) {
+- if (one_process && shutdown_pending) {
+- return;
+- }
+- else if (die_now) {
+- /* In graceful stop/restart; drop the mutex
+- * and terminate the child. */
+- SAFE_ACCEPT(accept_mutex_off());
+- clean_child_exit(0);
+- }
++ if (APR_STATUS_IS_TIMEUP(status) ||
++ APR_STATUS_IS_EINTR(status)) {
+ continue;
+ }
+ /* Single Unix documents select as returning errnos