]> git.pld-linux.org Git - packages/apache.git/blobdiff - apache-prefork-graceful-fix.patch
- from upstream: fix child process hang during graceful restart/stop in
[packages/apache.git] / apache-prefork-graceful-fix.patch
diff --git a/apache-prefork-graceful-fix.patch b/apache-prefork-graceful-fix.patch
new file mode 100644 (file)
index 0000000..d5085db
--- /dev/null
@@ -0,0 +1,42 @@
+--- 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
This page took 0.144124 seconds and 4 git commands to generate.