On 06/12/2007 02:32 AM, [EMAIL PROTECTED] wrote: > Author: pquerna > Date: Mon Jun 11 17:32:24 2007 > New Revision: 546328 > > URL: http://svn.apache.org/viewvc?view=rev&rev=546328 > Log: > Add a clogging_input_filters variable to the conn_rec, enabling the Event MPM > to know when its running with an input filter that buffers its own data, like > mod_ssl. > > Modified: > httpd/httpd/trunk/CHANGES > httpd/httpd/trunk/include/httpd.h > httpd/httpd/trunk/modules/http/http_core.c > httpd/httpd/trunk/modules/ssl/ssl_engine_io.c > httpd/httpd/trunk/server/core.c > httpd/httpd/trunk/server/mpm/experimental/event/event.c >
> > Modified: httpd/httpd/trunk/include/httpd.h > URL: > http://svn.apache.org/viewvc/httpd/httpd/trunk/include/httpd.h?view=diff&rev=546328&r1=546327&r2=546328 > ============================================================================== > --- httpd/httpd/trunk/include/httpd.h (original) > +++ httpd/httpd/trunk/include/httpd.h Mon Jun 11 17:32:24 2007 > @@ -1081,6 +1081,11 @@ > int data_in_input_filters; > /** Is there data pending in the output filters? */ > int data_in_output_filters; > + Nitpicking and style police: Empty lines should be completely empty and should not contain spaces. > + /** Are there any filters that clogg/buffer the input stream, breaking > + * the event mpm. > + */ > + int clogging_input_filters; > }; I am missing a minor bump since this is a change of the public API. > > /** > > Modified: httpd/httpd/trunk/modules/http/http_core.c > URL: > http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/http/http_core.c?view=diff&rev=546328&r1=546327&r2=546328 > ============================================================================== > --- httpd/httpd/trunk/modules/http/http_core.c (original) > +++ httpd/httpd/trunk/modules/http/http_core.c Mon Jun 11 17:32:24 2007 > @@ -119,11 +119,17 @@ > return DEFAULT_HTTP_PORT; > } > > +static int ap_process_http_connection(conn_rec *c); > + Nitpicking and style: I think you should either declare a prototype at the top of the file just before all function implementations start or you can just move ap_process_http_connection here (which of course may make backports of other future changes to this file harder and thus might not be the best solution). > static int ap_process_http_async_connection(conn_rec *c) > { > request_rec *r; > conn_state_t *cs = c->cs; > > + if (c->clogging_input_filters) { > + return ap_process_http_connection(c); > + } > + Nitpicking and style police: Empty lines should be completely empty and should not contain spaces. > AP_DEBUG_ASSERT(cs->state == CONN_STATE_READ_REQUEST_LINE); > > while (cs->state == CONN_STATE_READ_REQUEST_LINE) { > > Modified: httpd/httpd/trunk/modules/ssl/ssl_engine_io.c > URL: > http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/ssl/ssl_engine_io.c?view=diff&rev=546328&r1=546327&r2=546328 > ============================================================================== > --- httpd/httpd/trunk/modules/ssl/ssl_engine_io.c (original) > +++ httpd/httpd/trunk/modules/ssl/ssl_engine_io.c Mon Jun 11 17:32:24 2007 > @@ -1665,6 +1665,9 @@ > filter_ctx->pbioWrite = BIO_new(&bio_filter_out_method); > filter_ctx->pbioWrite->ptr = (void *)bio_filter_out_ctx_new(filter_ctx, > c); > > + /* We insert a clogging input filter. Let the core know. */ > + c->clogging_input_filters = 1; > + Nitpicking and style police: Empty lines should be completely empty and should not contain spaces. > ssl_io_input_add_filter(filter_ctx, c, ssl); > > SSL_set_bio(ssl, filter_ctx->pbioRead, filter_ctx->pbioWrite); > > Modified: httpd/httpd/trunk/server/mpm/experimental/event/event.c > URL: > http://svn.apache.org/viewvc/httpd/httpd/trunk/server/mpm/experimental/event/event.c?view=diff&rev=546328&r1=546327&r2=546328 > ============================================================================== > --- httpd/httpd/trunk/server/mpm/experimental/event/event.c (original) > +++ httpd/httpd/trunk/server/mpm/experimental/event/event.c Mon Jun 11 > 17:32:24 2007 > @@ -620,6 +620,16 @@ > pt = cs->pfd.client_data; > } > > + if (c->clogging_input_filters && !c->aborted) { > + /* Since we have an input filter which 'cloggs' the input stream, > + * like mod_ssl, lets just do the normal read from input filters, > + * like the Worker MPM does. > + */ > + ap_run_process_connection(c); > + ap_lingering_close(c); > + return 0; I am not that deep into the event MPM code, but if we get into the lingering close state of an async connection (c->clogging_input_filters = 0 && cs->state == CONN_STATE_LINGER) we do the following: ap_lingering_close(c); apr_pool_clear(p); ap_push_pool(worker_queue_info, p); return 1; I fear that we will leak pools and memory if we don't clear them and push them back in the queue. To be honest I have no idea why we do a return 1 in this situtaion. It seems wrong to me and should be return 0 instead. Another alternative would be to do cs->state = CONN_STATE_LINGER instead of > + ap_lingering_close(c); > + return 0; Regards RĂ¼diger