From: Nick Kew Date: Thu, 25 Dec 2008 20:40:01 +0000 (+0000) Subject: Fix r729438 to commit the right version of the patch, dammit! X-Git-Tag: 2.3.1~57 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=42cb513a13a1bfd65c6bda67083526080a5e3b62;p=apache Fix r729438 to commit the right version of the patch, dammit! Basant's real patch to optimise mod_sed throughput git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@729439 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/modules/filters/libsed.h b/modules/filters/libsed.h index c1302623ed..6a8504afb9 100644 --- a/modules/filters/libsed.h +++ b/modules/filters/libsed.h @@ -62,8 +62,8 @@ struct sed_label_s { sed_reptr_t *address; }; -typedef void (sed_err_fn_t)(void *data, const char *error); -typedef void (sed_write_fn_t)(void *ctx, char *buf, int sz); +typedef apr_status_t (sed_err_fn_t)(void *data, const char *error); +typedef apr_status_t (sed_write_fn_t)(void *ctx, char *buf, int sz); typedef struct sed_commands_s sed_commands_t; #define NWFILES 11 /* 10 plus one for standard output */ diff --git a/modules/filters/mod_sed.c b/modules/filters/mod_sed.c index 190c199be8..1fc72b0579 100644 --- a/modules/filters/mod_sed.c +++ b/modules/filters/mod_sed.c @@ -60,19 +60,21 @@ module AP_MODULE_DECLARE_DATA sed_module; /* This function will be call back from libsed functions if there is any error * happend during execution of sed scripts */ -static void log_sed_errf(void *data, const char *error) +static apr_status_t log_sed_errf(void *data, const char *error) { request_rec *r = (request_rec *) data; ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, error); + return APR_SUCCESS; } /* This function will be call back from libsed functions if there is any * compilation error. */ -static void sed_compile_errf(void *data, const char *error) +static apr_status_t sed_compile_errf(void *data, const char *error) { sed_expr_config *sed_cfg = (sed_expr_config *) data; sed_cfg->last_error = error; + return APR_SUCCESS; } /* clear the temporary pool (used for transient buckets) @@ -97,9 +99,9 @@ static void alloc_outbuf(sed_filter_ctxt* ctx) /* append_bucket * Allocate a new bucket from buf and sz and append to ctx->bb */ -static void append_bucket(sed_filter_ctxt* ctx, char* buf, int sz) +static apr_status_t append_bucket(sed_filter_ctxt* ctx, char* buf, int sz) { - int rv; + apr_status_t status = APR_SUCCESS; apr_bucket *b; if (ctx->tpool == ctx->r->pool) { /* We are not using transient bucket */ @@ -116,38 +118,42 @@ static void append_bucket(sed_filter_ctxt* ctx, char* buf, int sz) if (ctx->numbuckets >= MAX_TRANSIENT_BUCKETS) { b = apr_bucket_flush_create(ctx->r->connection->bucket_alloc); APR_BRIGADE_INSERT_TAIL(ctx->bb, b); - rv = ap_pass_brigade(ctx->f->next, ctx->bb); + status = ap_pass_brigade(ctx->f->next, ctx->bb); apr_brigade_cleanup(ctx->bb); clear_ctxpool(ctx); } } + return status; } /* * flush_output_buffer * Flush the output data (stored in ctx->outbuf) */ -static void flush_output_buffer(sed_filter_ctxt *ctx) +static apr_status_t flush_output_buffer(sed_filter_ctxt *ctx) { int size = ctx->curoutbuf - ctx->outbuf; char *out; + apr_status_t status = APR_SUCCESS; if ((ctx->outbuf == NULL) || (size <=0)) - return; + return status; out = apr_palloc(ctx->tpool, size); memcpy(out, ctx->outbuf, size); - append_bucket(ctx, out, size); + status = append_bucket(ctx, out, size); ctx->curoutbuf = ctx->outbuf; + return status; } /* This is a call back function. When libsed wants to generate the output, * this function will be invoked. */ -static void sed_write_output(void *dummy, char *buf, int sz) +static apr_status_t sed_write_output(void *dummy, char *buf, int sz) { /* dummy is basically filter context. Context is passed during invocation * of sed_eval_buffer */ int remainbytes = 0; + apr_status_t status = APR_SUCCESS; sed_filter_ctxt *ctx = (sed_filter_ctxt *) dummy; if (ctx->outbuf == NULL) { alloc_outbuf(ctx); @@ -161,14 +167,15 @@ static void sed_write_output(void *dummy, char *buf, int sz) ctx->curoutbuf += remainbytes; } /* buffer is now full */ - append_bucket(ctx, ctx->outbuf, ctx->bufsize); + status = append_bucket(ctx, ctx->outbuf, ctx->bufsize); /* old buffer is now used so allocate new buffer */ alloc_outbuf(ctx); - /* if size is bigger than the allocated buffer directly add to output brigade */ - if (sz >= ctx->bufsize) { + /* if size is bigger than the allocated buffer directly add to output + * brigade */ + if ((status == APR_SUCCESS) && (sz >= ctx->bufsize)) { char* newbuf = apr_palloc(ctx->tpool, sz); memcpy(newbuf, buf, sz); - append_bucket(ctx, newbuf, sz); + status = append_bucket(ctx, newbuf, sz); /* pool might get clear after append_bucket */ if (ctx->outbuf == NULL) { alloc_outbuf(ctx); @@ -183,6 +190,7 @@ static void sed_write_output(void *dummy, char *buf, int sz) memcpy(ctx->curoutbuf, buf, sz); ctx->curoutbuf += sz; } + return status; } /* Compile a sed expression. Compiled context is saved in sed_cfg->sed_cmds. @@ -227,7 +235,6 @@ static apr_status_t init_context(ap_filter_t *f, sed_expr_config *sed_cfg, int u { apr_status_t status; sed_filter_ctxt* ctx; - apr_pool_t *tpool; request_rec *r = f->r; /* Create the context. Call sed_init_eval. libsed will generated * output by calling sed_write_output and generates any error by @@ -318,7 +325,11 @@ static apr_status_t sed_response_filter(ap_filter_t *f, apr_bucket *b1 = APR_BUCKET_NEXT(b); /* Now clean up the internal sed buffer */ sed_finalize_eval(&ctx->eval, ctx); - flush_output_buffer(ctx); + status = flush_output_buffer(ctx); + if (status != APR_SUCCESS) { + clear_ctxpool(ctx); + return status; + } APR_BUCKET_REMOVE(b); /* Insert the eos bucket to ctx->bb brigade */ APR_BRIGADE_INSERT_TAIL(ctx->bb, b); @@ -327,7 +338,11 @@ static apr_status_t sed_response_filter(ap_filter_t *f, else if (APR_BUCKET_IS_FLUSH(b)) { apr_bucket *b1 = APR_BUCKET_NEXT(b); APR_BUCKET_REMOVE(b); - flush_output_buffer(ctx); + status = flush_output_buffer(ctx); + if (status != APR_SUCCESS) { + clear_ctxpool(ctx); + return status; + } APR_BRIGADE_INSERT_TAIL(ctx->bb, b); b = b1; } @@ -353,8 +368,11 @@ static apr_status_t sed_response_filter(ap_filter_t *f, } } apr_brigade_cleanup(bb); - flush_output_buffer(ctx); - status = APR_SUCCESS; + status = flush_output_buffer(ctx); + if (status != APR_SUCCESS) { + clear_ctxpool(ctx); + return status; + } if (!APR_BRIGADE_EMPTY(ctx->bb)) { status = ap_pass_brigade(f->next, ctx->bb); apr_brigade_cleanup(ctx->bb); diff --git a/modules/filters/sed1.c b/modules/filters/sed1.c index a14d378572..24f16f0501 100644 --- a/modules/filters/sed1.c +++ b/modules/filters/sed1.c @@ -71,8 +71,8 @@ static apr_status_t dosub(sed_eval_t *eval, char *rhsbuf, int n, static char *place(sed_eval_t *eval, char *asp, char *al1, char *al2); static apr_status_t command(sed_eval_t *eval, sed_reptr_t *ipc, step_vars_storage *step_vars); -static void wline(sed_eval_t *eval, char *buf, int sz); -static void arout(sed_eval_t *eval); +static apr_status_t wline(sed_eval_t *eval, char *buf, int sz); +static apr_status_t arout(sed_eval_t *eval); static void eval_errf(sed_eval_t *eval, const char *fmt, ...) { @@ -370,8 +370,8 @@ apr_status_t sed_eval_buffer(sed_eval_t *eval, const char *buf, int bufsz, void eval->lspend--; *eval->lspend = '\0'; rv = execute(eval); - if (rv != 0) - return APR_EGENERAL; + if (rv != APR_SUCCESS) + return rv; } while (bufsz) { @@ -396,8 +396,8 @@ apr_status_t sed_eval_buffer(sed_eval_t *eval, const char *buf, int bufsz, void buf += (llen + 1); bufsz -= (llen + 1); rv = execute(eval); - if (rv != 0) - return APR_EGENERAL; + if (rv != APR_SUCCESS) + return rv; if (eval->quitflag) break; } @@ -440,8 +440,8 @@ apr_status_t sed_finalize_eval(sed_eval_t *eval, void *fout) *eval->lspend = '\0'; rv = execute(eval); - if (rv != 0) - return APR_EGENERAL; + if (rv != APR_SUCCESS) + return rv; } eval->quitflag = 1; @@ -456,6 +456,7 @@ static apr_status_t execute(sed_eval_t *eval) { sed_reptr_t *ipc = eval->commands->ptrspace; step_vars_storage step_vars; + apr_status_t rv = APR_SUCCESS; eval->lnum++; @@ -471,7 +472,6 @@ static apr_status_t execute(sed_eval_t *eval) while (ipc->command) { char *p1; char *p2; - apr_status_t rv; int c; p1 = ipc->ad1; @@ -554,17 +554,20 @@ yes: ipc = ipc->next; } - if (!eval->commands->nflag && !eval->delflag) - wline(eval, eval->linebuf, eval->lspend - eval->linebuf); + if (!eval->commands->nflag && !eval->delflag) { + rv = wline(eval, eval->linebuf, eval->lspend - eval->linebuf); + if (rv != APR_SUCCESS) + return rv; + } if (eval->aptr > eval->abuf) - arout(eval); + rv = arout(eval); eval->delflag = 0; eval->lspend = eval->linebuf; - return APR_SUCCESS; + return rv; } /* @@ -686,6 +689,7 @@ static apr_status_t command(sed_eval_t *eval, sed_reptr_t *ipc, char *p1, *p2, *p3; int length; char sz[32]; /* 32 bytes enough to store 64 bit integer in decimal */ + apr_status_t rv = APR_SUCCESS; switch(ipc->command) { @@ -704,7 +708,7 @@ static apr_status_t command(sed_eval_t *eval, sed_reptr_t *ipc, if(!eval->inar[ipc->nrep] || eval->dolflag) { for (p1 = ipc->re1; *p1; p1++) ; - wline(eval, ipc->re1, p1 - ipc->re1); + rv = wline(eval, ipc->re1, p1 - ipc->re1); } break; case DCOM: @@ -727,7 +731,7 @@ static apr_status_t command(sed_eval_t *eval, sed_reptr_t *ipc, case EQCOM: length = apr_snprintf(sz, sizeof(sz), "%d", (int) eval->lnum); - wline(eval, sz, length); + rv = wline(eval, sz, length); break; case GCOM: @@ -750,7 +754,7 @@ static apr_status_t command(sed_eval_t *eval, sed_reptr_t *ipc, case ICOM: for (p1 = ipc->re1; *p1; p1++); - wline(eval, ipc->re1, p1 - ipc->re1); + rv = wline(eval, ipc->re1, p1 - ipc->re1); break; case BCOM: @@ -769,8 +773,10 @@ static apr_status_t command(sed_eval_t *eval, sed_reptr_t *ipc, while ((*p2++ = *p3++) != 0) if(p2 >= eval->lcomend) { *p2 = '\\'; - wline(eval, eval->genbuf, - strlen(eval->genbuf)); + rv = wline(eval, eval->genbuf, + strlen(eval->genbuf)); + if (rv != APR_SUCCESS) + return rv; p2 = eval->genbuf; } p2--; @@ -781,32 +787,47 @@ static apr_status_t command(sed_eval_t *eval, sed_reptr_t *ipc, *p2++ = '\\'; if(p2 >= eval->lcomend) { *p2 = '\\'; - wline(eval, eval->genbuf, strlen(eval->genbuf)); + rv = wline(eval, eval->genbuf, + strlen(eval->genbuf)); + if (rv != APR_SUCCESS) + return rv; p2 = eval->genbuf; } *p2++ = (*p1 >> 6) + '0'; if(p2 >= eval->lcomend) { *p2 = '\\'; - wline(eval, eval->genbuf, strlen(eval->genbuf)); + rv = wline(eval, eval->genbuf, + strlen(eval->genbuf)); + if (rv != APR_SUCCESS) + return rv; p2 = eval->genbuf; } *p2++ = ((*p1 >> 3) & 07) + '0'; if(p2 >= eval->lcomend) { *p2 = '\\'; - wline(eval, eval->genbuf, strlen(eval->genbuf)); + rv = wline(eval, eval->genbuf, + strlen(eval->genbuf)); + if (rv != APR_SUCCESS) + return rv; p2 = eval->genbuf; } *p2++ = (*p1++ & 07) + '0'; if(p2 >= eval->lcomend) { *p2 = '\\'; - wline(eval, eval->genbuf, strlen(eval->genbuf)); + rv = wline(eval, eval->genbuf, + strlen(eval->genbuf)); + if (rv != APR_SUCCESS) + return rv; p2 = eval->genbuf; } } else { *p2++ = *p1++; if(p2 >= eval->lcomend) { *p2 = '\\'; - wline(eval, eval->genbuf, strlen(eval->genbuf)); + rv = wline(eval, eval->genbuf, + strlen(eval->genbuf)); + if (rv != APR_SUCCESS) + return rv; p2 = eval->genbuf; } } @@ -815,48 +836,65 @@ static apr_status_t command(sed_eval_t *eval, sed_reptr_t *ipc, while ((*p2++ = *p3++) != 0) if(p2 >= eval->lcomend) { *p2 = '\\'; - wline(eval, eval->genbuf, strlen(eval->genbuf)); + rv = wline(eval, eval->genbuf, + strlen(eval->genbuf)); + if (rv != APR_SUCCESS) + return rv; p2 = eval->genbuf; } p2--; p1++; } *p2 = 0; - wline(eval, eval->genbuf, strlen(eval->genbuf)); + rv = wline(eval, eval->genbuf, strlen(eval->genbuf)); break; case NCOM: if(!eval->commands->nflag) { - wline(eval, eval->linebuf, eval->lspend - eval->linebuf); + rv = wline(eval, eval->linebuf, eval->lspend - eval->linebuf); + if (rv != APR_SUCCESS) + return rv; } - if(eval->aptr > eval->abuf) - arout(eval); + if(eval->aptr > eval->abuf) { + rv = arout(eval); + if (rv != APR_SUCCESS) + return rv; + } eval->lspend = eval->linebuf; eval->pending = ipc->next; break; case CNCOM: - if(eval->aptr > eval->abuf) - arout(eval); + if(eval->aptr > eval->abuf) { + rv = arout(eval); + if (rv != APR_SUCCESS) + return rv; + } append_to_linebuf(eval, "\n"); eval->pending = ipc->next; break; case PCOM: - wline(eval, eval->linebuf, eval->lspend - eval->linebuf); + rv = wline(eval, eval->linebuf, eval->lspend - eval->linebuf); break; case CPCOM: for (p1 = eval->linebuf; *p1 != '\n' && *p1 != '\0'; p1++); - wline(eval, eval->linebuf, p1 - eval->linebuf); + rv = wline(eval, eval->linebuf, p1 - eval->linebuf); break; case QCOM: - if (!eval->commands->nflag) - wline(eval, eval->linebuf, eval->lspend - eval->linebuf); + if (!eval->commands->nflag) { + rv = wline(eval, eval->linebuf, eval->lspend - eval->linebuf); + if (rv != APR_SUCCESS) + break; + } - if(eval->aptr > eval->abuf) - arout(eval); + if(eval->aptr > eval->abuf) { + rv = arout(eval); + if (rv != APR_SUCCESS) + return rv; + } eval->quitflag = 1; break; @@ -876,10 +914,15 @@ static apr_status_t command(sed_eval_t *eval, sed_reptr_t *ipc, } if(ipc->pfl && eval->commands->nflag && i) { if(ipc->pfl == 1) { - wline(eval, eval->linebuf, eval->lspend - eval->linebuf); + rv = wline(eval, eval->linebuf, eval->lspend - + eval->linebuf); + if (rv != APR_SUCCESS) + return rv; } else { for (p1 = eval->linebuf; *p1 != '\n' && *p1 != '\0'; p1++); - wline(eval, eval->linebuf, p1 - eval->linebuf); + rv = wline(eval, eval->linebuf, p1 - eval->linebuf); + if (rv != APR_SUCCESS) + return rv; } } if (i && (ipc->findex >= 0) && eval->fcode[ipc->findex]) @@ -910,21 +953,24 @@ static apr_status_t command(sed_eval_t *eval, sed_reptr_t *ipc, while((*p1 = p2[(unsigned char)*p1]) != 0) p1++; break; } - return APR_SUCCESS; + return rv; } /* * arout */ -static void arout(sed_eval_t *eval) +static apr_status_t arout(sed_eval_t *eval) { + apr_status_t rv = APR_SUCCESS; eval->aptr = eval->abuf - 1; while (*++eval->aptr) { if ((*eval->aptr)->command == ACOM) { char *p1; for (p1 = (*eval->aptr)->re1; *p1; p1++); - wline(eval, (*eval->aptr)->re1, p1 - (*eval->aptr)->re1); + rv = wline(eval, (*eval->aptr)->re1, p1 - (*eval->aptr)->re1); + if (rv != APR_SUCCESS) + return rv; } else { apr_file_t *fi = NULL; char buf[512]; @@ -936,7 +982,11 @@ static void arout(sed_eval_t *eval) while ((apr_file_read(fi, buf, &n)) == APR_SUCCESS) { if (n == 0) break; - eval->writefn(eval->fout, buf, n); + rv = eval->writefn(eval->fout, buf, n); + if (rv != APR_SUCCESS) { + apr_file_close(fi); + return rv; + } n = sizeof(buf); } apr_file_close(fi); @@ -944,14 +994,19 @@ static void arout(sed_eval_t *eval) } eval->aptr = eval->abuf; *eval->aptr = NULL; + return rv; } /* * wline */ -static void wline(sed_eval_t *eval, char *buf, int sz) +static apr_status_t wline(sed_eval_t *eval, char *buf, int sz) { - eval->writefn(eval->fout, buf, sz); - eval->writefn(eval->fout, "\n", 1); + apr_status_t rv = APR_SUCCESS; + rv = eval->writefn(eval->fout, buf, sz); + if (rv != APR_SUCCESS) + return rv; + rv = eval->writefn(eval->fout, "\n", 1); + return rv; }