On Mon, Jan 4, 2016 at 4:30 PM,  <[email protected]> wrote:
> Author: icing
> Date: Mon Jan  4 15:30:36 2016
> New Revision: 1722899
>
> URL: http://svn.apache.org/viewvc?rev=1722899&view=rev
> Log:
> reworked synching of session shutdown with worker threads, workers now stick 
> to a session until no more reuqquest are tbd, keepalive handling revisited
>
[]
>
> Modified: httpd/httpd/trunk/modules/http2/h2_mplx.c
> URL: 
> http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/http2/h2_mplx.c?rev=1722899&r1=1722898&r2=1722899&view=diff
> ==============================================================================
> --- httpd/httpd/trunk/modules/http2/h2_mplx.c (original)
> +++ httpd/httpd/trunk/modules/http2/h2_mplx.c Mon Jan  4 15:30:36 2016
[]
> @@ -700,33 +694,25 @@ apr_status_t h2_mplx_out_write(h2_mplx *
>  {
>      apr_status_t status;
>      AP_DEBUG_ASSERT(m);
> -    if (m->aborted) {
> -        return APR_ECONNABORTED;
> -    }
>      status = apr_thread_mutex_lock(m->lock);
>      if (APR_SUCCESS == status) {
> -        if (!m->aborted) {
> -            h2_io *io = h2_io_set_get(m->stream_ios, stream_id);
> -            if (io && !io->orphaned) {
> -                status = out_write(m, io, f, bb, trailers, iowait);
> -                ap_log_cerror(APLOG_MARK, APLOG_TRACE1, status, m->c,
> -                              "h2_mplx(%ld-%d): write with trailers=%s",
> -                              m->id, io->id, trailers? "yes" : "no");
> -                H2_MPLX_IO_OUT(APLOG_TRACE2, m, io, "h2_mplx_out_write");
> -
> -                have_out_data_for(m, stream_id);
> -                if (m->aborted) {
> -                    return APR_ECONNABORTED;
> -                }
> -            }
> -            else {
> -                status = APR_ECONNABORTED;
> +        h2_io *io = h2_io_set_get(m->stream_ios, stream_id);
> +        if (io && !io->orphaned) {
> +            status = out_write(m, io, f, bb, trailers, iowait);
> +            ap_log_cerror(APLOG_MARK, APLOG_TRACE1, status, m->c,
> +                          "h2_mplx(%ld-%d): write with trailers=%s",
> +                          m->id, io->id, trailers? "yes" : "no");
> +            H2_MPLX_IO_OUT(APLOG_TRACE2, m, io, "h2_mplx_out_write");
> +
> +            have_out_data_for(m, stream_id);
> +            if (m->aborted) {
> +                return APR_ECONNABORTED;

No apr_thread_mutex_unlock(m->lock) before leaving here?

>              }
>          }
> -
> -        if (m->lock) {
> -            apr_thread_mutex_unlock(m->lock);
> +        else {
> +            status = APR_ECONNABORTED;
>          }
> +        apr_thread_mutex_unlock(m->lock);
>      }
>      return status;
>  }
> @@ -735,44 +721,39 @@ apr_status_t h2_mplx_out_close(h2_mplx *
>  {
>      apr_status_t status;
>      AP_DEBUG_ASSERT(m);
> -    if (m->aborted) {
> -        return APR_ECONNABORTED;
> -    }
>      status = apr_thread_mutex_lock(m->lock);
>      if (APR_SUCCESS == status) {
> -        if (!m->aborted) {
> -            h2_io *io = h2_io_set_get(m->stream_ios, stream_id);
> -            if (io && !io->orphaned) {
> -                if (!io->response && !io->rst_error) {
> -                    /* In case a close comes before a response was created,
> -                     * insert an error one so that our streams can properly
> -                     * reset.
> -                     */
> -                    h2_response *r = h2_response_die(stream_id, APR_EGENERAL,
> -                                                     io->request, m->pool);
> -                    status = out_open(m, stream_id, r, NULL, NULL, NULL);
> -                    ap_log_cerror(APLOG_MARK, APLOG_TRACE1, status, m->c,
> -                                  "h2_mplx(%ld-%d): close, no response, no 
> rst",
> -                                  m->id, io->id);
> -                }
> +        h2_io *io = h2_io_set_get(m->stream_ios, stream_id);
> +        if (io && !io->orphaned) {
> +            if (!io->response && !io->rst_error) {
> +                /* In case a close comes before a response was created,
> +                 * insert an error one so that our streams can properly
> +                 * reset.
> +                 */
> +                h2_response *r = h2_response_die(stream_id, APR_EGENERAL,
> +                                                 io->request, m->pool);
> +                status = out_open(m, stream_id, r, NULL, NULL, NULL);
>                  ap_log_cerror(APLOG_MARK, APLOG_TRACE1, status, m->c,
> -                              "h2_mplx(%ld-%d): close with trailers=%s",
> -                              m->id, io->id, trailers? "yes" : "no");
> -                status = h2_io_out_close(io, trailers);
> -                H2_MPLX_IO_OUT(APLOG_TRACE2, m, io, "h2_mplx_out_close");
> -
> -                have_out_data_for(m, stream_id);
> -                if (m->aborted) {
> -                    /* if we were the last output, the whole session might
> -                     * have gone down in the meantime.
> -                     */
> -                    return APR_SUCCESS;
> -                }
> +                              "h2_mplx(%ld-%d): close, no response, no rst",
> +                              m->id, io->id);
>              }
> -            else {
> -                status = APR_ECONNABORTED;
> +            ap_log_cerror(APLOG_MARK, APLOG_TRACE1, status, m->c,
> +                          "h2_mplx(%ld-%d): close with trailers=%s",
> +                          m->id, io->id, trailers? "yes" : "no");
> +            status = h2_io_out_close(io, trailers);
> +            H2_MPLX_IO_OUT(APLOG_TRACE2, m, io, "h2_mplx_out_close");
> +
> +            have_out_data_for(m, stream_id);
> +            if (m->aborted) {
> +                /* if we were the last output, the whole session might
> +                 * have gone down in the meantime.
> +                 */
> +                return APR_SUCCESS;

Likewise?

>              }
>          }
> +        else {
> +            status = APR_ECONNABORTED;
> +        }
>          apr_thread_mutex_unlock(m->lock);
>      }
>      return status;


Regards,
Yann.

Reply via email to