You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@httpd.apache.org by Rici Lake <ri...@ricilake.net> on 2005/04/25 20:19:10 UTC
For Review: mod_ext_filter.c
Patch to use a single temporary brigade instead of creating a new one
on each invocation:
(also does a little code reuse)
Index: mod_ext_filter.c
===================================================================
--- mod_ext_filter.c (revision 158730)
+++ mod_ext_filter.c (working copy)
@@ -70,6 +70,7 @@
#if APR_FILES_AS_SOCKETS
apr_pollset_t *pollset;
#endif
+ apr_bucket_brigade *bb_tmp;
} ef_ctx_t;
module AP_MODULE_DECLARE_DATA ext_filter_module;
@@ -614,6 +615,12 @@
}
}
+ /*
+ * Create a temporary brigade for output filter. This is not always
+ * used, but it's easier to just have it.
+ */
+ ctx->bb_tmp = apr_brigade_create(f->r->pool, f->c->bucket_alloc);
+
if (dc->debug >= DBGLVL_SHOWOPTIONS) {
ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, f->r,
"%sfiltering `%s' of type `%s' through `%s', cfg
%s",
@@ -747,10 +754,8 @@
apr_status_t rv;
char buf[4096];
apr_bucket *eos = NULL;
- apr_bucket_brigade *bb_tmp;
dc = ctx->dc;
- bb_tmp = apr_brigade_create(r->pool, c->bucket_alloc);
for (b = APR_BRIGADE_FIRST(bb);
b != APR_BRIGADE_SENTINEL(bb);
@@ -769,15 +774,14 @@
/* Good cast, we just tested len isn't negative */
if (len > 0 &&
- (rv = pass_data_to_filter(f, data, (apr_size_t)len,
bb_tmp))
+ (rv = pass_data_to_filter(f, data, (apr_size_t)len,
ctx->bb_tmp))
!= APR_SUCCESS) {
return rv;
}
}
apr_brigade_cleanup(bb);
- APR_BRIGADE_CONCAT(bb, bb_tmp);
- apr_brigade_destroy(bb_tmp);
+ APR_BRIGADE_CONCAT(bb, ctx->bb_tmp);
if (eos) {
/* close the child's stdin to signal that no more data is
coming;
@@ -800,30 +804,12 @@
}
}
- do {
- len = sizeof(buf);
- rv = apr_file_read(ctx->proc->out,
- buf,
- &len);
- if ((rv && !APR_STATUS_IS_EOF(rv) &&
!APR_STATUS_IS_EAGAIN(rv)) ||
- dc->debug >= DBGLVL_GORY) {
- ap_log_rerror(APLOG_MARK, APLOG_DEBUG, rv, r,
- "apr_file_read(child output), len %"
APR_SIZE_T_FMT,
- !rv ? len : -1);
- }
- if (APR_STATUS_IS_EAGAIN(rv)) {
- if (eos) {
- /* should not occur, because we have an APR timeout in
place */
- AP_DEBUG_ASSERT(1 != 1);
- }
- return APR_SUCCESS;
- }
-
- if (rv == APR_SUCCESS) {
- b = apr_bucket_heap_create(buf, len, NULL,
c->bucket_alloc);
- APR_BRIGADE_INSERT_TAIL(bb, b);
- }
- } while (rv == APR_SUCCESS);
+ rv = drain_available_output(f, bb);
+ if (APR_STATUS_IS_EAGAIN(rv)) {
+ AP_DEBUG_ASSERT(!eos);
+ /* should not occur, because we have an APR timeout in place */
+ return APR_SUCCESS;
+ }
if (!APR_STATUS_IS_EOF(rv)) {
return rv;