]> granicus.if.org Git - apache/commitdiff
Fix r729438 to commit the right version of the patch, dammit!
authorNick Kew <niq@apache.org>
Thu, 25 Dec 2008 20:40:01 +0000 (20:40 +0000)
committerNick Kew <niq@apache.org>
Thu, 25 Dec 2008 20:40:01 +0000 (20:40 +0000)
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

modules/filters/libsed.h
modules/filters/mod_sed.c
modules/filters/sed1.c

index c1302623ed679b42cc6e5650b5eab314a7046d60..6a8504afb922727890d9dd28ca633aba25355af8 100644 (file)
@@ -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 */
index 190c199be809a2fa733fb1fb7e090006139de758..1fc72b057952d83ca7b540429e72c891320c5291 100644 (file)
@@ -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);
index a14d37857233992002c4ba139665c5047ac585ca..24f16f050181a105e70b260b77ab44f97920eb3d 100644 (file)
@@ -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;
 }