Commit abb3af05 authored by Ruediger Pluem's avatar Ruediger Pluem
Browse files

Merge r702867 from trunk:

* Recheck again if idle workers are still available when we are signaled that
  they are. This is needed since it can happen that we are signaled by a
  worker thread that went idle but received a context switch before it could
  tell us. If it does signal us later once it is on CPU again there might be
  no idle worker left. See
  https://issues.apache.org/bugzilla/show_bug.cgi?id=45605#c4

PR: 45605
Submitted by: Denis Ustimenko <denusk gmail.com>
Reviewed by: rpluem, jim, gregames


git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.2.x@705872 13f79535-47bb-0310-9956-ffa450edef68
parent 58e4338a
Loading
Loading
Loading
Loading
+3 −0
Changes for CHANGES: 3 added lines, 0 removed lines.
Original line number Diff line number Diff line
                                                         -*- coding: utf-8 -*-
Changes with Apache 2.2.11

  *) Worker MPM: Crosscheck that idle workers are still available before using
     them and thus preventing an overflow of the worker queue which causes
     a SegFault. PR 45605 [Denis Ustimenko <denusk gmail.com>]

Changes with Apache 2.2.10

+0 −10
Changes for STATUS: 0 added lines, 10 removed lines.
Original line number Diff line number Diff line
@@ -85,16 +85,6 @@ RELEASE SHOWSTOPPERS:
PATCHES ACCEPTED TO BACKPORT FROM TRUNK:
  [ start all new proposals below, under PATCHES PROPOSED. ]

   * Worker MPM: Crosscheck that idle workers are still available before using
     them and thus preventing an overflow of the worker queue which causes
     a SegFault.
     PR: 45605
     Trunk version of patch:
        http://svn.apache.org/viewvc?rev=702867&view=rev
     Backport version for 2.2.x of patch:
        Trunk version of patch works
     +1: rpluem, jim, gregames


PATCHES PROPOSED TO BACKPORT FROM TRUNK:
  [ New proposals should be added at the end of the list ]
+10 −2
Changes for server/mpm/worker/fdqueue.c: 10 added lines, 2 removed lines.
Original line number Diff line number Diff line
@@ -155,7 +155,15 @@ apr_status_t ap_queue_info_wait_for_idler(fd_queue_info_t *queue_info,
         * region, one of two things may have happened:
         *   - If the idle worker count is still zero, the
         *     workers are all still busy, so it's safe to
         *     block on a condition variable.
         *     block on a condition variable, BUT
         *     we need to check for idle worker count again
         *     when we are signaled since it can happen that
         *     we are signaled by a worker thread that went idle
         *     but received a context switch before it could
         *     tell us. If it does signal us later once it is on
         *     CPU again there might be no idle worker left.
         *     See
         *     https://issues.apache.org/bugzilla/show_bug.cgi?id=45605#c4
         *   - If the idle worker count is nonzero, then a
         *     worker has become idle since the first check
         *     of queue_info->idlers above.  It's possible
@@ -166,7 +174,7 @@ apr_status_t ap_queue_info_wait_for_idler(fd_queue_info_t *queue_info,
         *     now nonzero, it's safe for this function to
         *     return immediately.
         */
        if (queue_info->idlers == 0) {
        while (queue_info->idlers == 0) {
            rv = apr_thread_cond_wait(queue_info->wait_for_idler,
                                  queue_info->idlers_mutex);
            if (rv != APR_SUCCESS) {