You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by rb...@locus.apache.org on 2000/07/14 02:24:34 UTC

cvs commit: apache-2.0/src/lib/apr/buckets ap_buf.c ap_mmap_buf.c ap_rmem_buf.c ap_rwmem_buf.c apr_buf.h

rbb         00/07/13 17:24:33

  Modified:    src/lib/apr/buckets ap_buf.c ap_mmap_buf.c ap_rmem_buf.c
                        ap_rwmem_buf.c apr_buf.h
  Log:
  The write functions are now also function pointers.  This allows people
  to easily insert data to a bucket brigade.  I need to re-write the brigade
  insert routines, but that can come tomorrow.
  
  Revision  Changes    Path
  1.12      +23 -8     apache-2.0/src/lib/apr/buckets/ap_buf.c
  
  Index: ap_buf.c
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/lib/apr/buckets/ap_buf.c,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- ap_buf.c	2000/07/13 21:48:33	1.11
  +++ ap_buf.c	2000/07/14 00:24:33	1.12
  @@ -56,14 +56,15 @@
    */
   
   #include "apr_private.h"
  +#include "apr_pools.h"
   #include "apr_lib.h"
   #include "apr_errno.h"
   #include <stdlib.h>
   #include <sys/uio.h>
   #include "apr_buf.h"
   
  -/* We are creating a new bucket here.  We could replace the switch with a
  - * function pointer if we want to.  I'm not sure it's a real win though.
  +/* We are creating a new bucket here.  The buckets that are created
  + * have the correct function pointers and types when they are created. 
    */
   APR_EXPORT(ap_bucket *) ap_bucket_new(ap_bucket_color_e color)
   {
  @@ -110,7 +111,7 @@
   {
       ap_bucket_brigade *b;
   
  -    b = malloc(sizeof(*b));
  +    b = ap_palloc(p, sizeof(*b));
       b->p = p;
       b->head = b->tail = NULL;
   
  @@ -276,15 +277,29 @@
   
       if (b->tail && b->tail->bucket && 
           b->tail->bucket->color == AP_BUCKET_rwmem) {
  -        ap_bucket_rwmem *rw;
  -        rw = b->tail->bucket->data;
  +        ap_bucket *rw;
  +        rw = b->tail->bucket;
           /* I have no idea if this is a good idea or not.  Probably not.
            * Basically, if the last bucket in the list is a rwmem bucket,
            * then we just add to it instead of allocating a new read only
            * bucket.  This is incredibly easy to take out if it is a bad 
            * idea.  RBB
            */
  -        ap_rwmem_vputstrs(rw, va);
  +        for (k = 0;;) {
  +            x = va_arg(va, const char *);
  +            if (x == NULL)
  +                break;
  +            j = strlen(x);
  +           
  +            rv = rw->insert(rw, x, j, &i);
  +            if (i != j) {
  +                /* Do we need better error reporting?  */
  +                return -1;
  +            }
  +            k += i;
  +
  +            ap_bucket_brigade_append_bucket(b, rw);
  +        }        
       }
       
       for (k = 0;;) {
  @@ -294,7 +309,7 @@
               break;
           j = strlen(x);
          
  -        rv = ap_rwmem_write(r->data, x, j, &i);
  +        rv = r->insert(r, x, j, &i);
           if (i != j) {
               /* Do we need better error reporting?  */
               return -1;
  @@ -330,7 +345,7 @@
       res = ap_vsnprintf(buf, 4096, fmt, va);
   
       r = ap_bucket_new(AP_BUCKET_rwmem);
  -    res = ap_rwmem_write(r->data, buf, strlen(buf), &i);
  +    res = r->insert(r, buf, strlen(buf), &i);
       ap_bucket_brigade_append_bucket(b, r);
   
       return res;
  
  
  
  1.4       +16 -6     apache-2.0/src/lib/apr/buckets/ap_mmap_buf.c
  
  Index: ap_mmap_buf.c
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/lib/apr/buckets/ap_mmap_buf.c,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- ap_mmap_buf.c	2000/07/13 21:48:33	1.3
  +++ ap_mmap_buf.c	2000/07/14 00:24:33	1.4
  @@ -68,9 +68,22 @@
   static int mmap_get_len(ap_bucket *e)
   {
       ap_bucket_mmap *b = (ap_bucket_mmap *)e->data;
  -    return b->data->size;
  +    return b->len;
   }
   
  +static ap_status_t mmap_bucket_insert(ap_bucket *e, const void *buf, 
  +                                      ap_size_t nbytes, ap_ssize_t *w)
  +{
  +    ap_bucket_mmap *b = (ap_bucket_mmap *)e->data;
  +    const ap_mmap_t *mm = buf;
  +
  +    b->data = mm;
  +    b->len = nbytes;
  +    *w = nbytes;
  +    return APR_SUCCESS;
  +}
  +    
  +
   APR_EXPORT(ap_bucket *) ap_mmap_bucket_create(void)
   {
       ap_bucket *newbuf;
  @@ -80,18 +93,15 @@
       b                 = malloc(sizeof(*b));
   
       b->data      = NULL;
  +    b->len       = 0;
   
       newbuf->color     = AP_BUCKET_mmap;
       newbuf->getstr    = mmap_get_str;
       newbuf->getlen    = mmap_get_len;
  +    newbuf->insert    = mmap_bucket_insert;
       newbuf->free      = NULL;
       newbuf->data      = b;
       
       return newbuf;
   }
   
  -APR_EXPORT(void) ap_mmap_bucket_insert(ap_bucket_mmap *b, ap_mmap_t *mm)
  -{
  -    b->data = mm;
  -}
  -    
  
  
  
  1.5       +26 -23    apache-2.0/src/lib/apr/buckets/ap_rmem_buf.c
  
  Index: ap_rmem_buf.c
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/lib/apr/buckets/ap_rmem_buf.c,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- ap_rmem_buf.c	2000/07/13 21:48:33	1.4
  +++ ap_rmem_buf.c	2000/07/14 00:24:33	1.5
  @@ -75,25 +75,6 @@
       return (char *)b->end - (char *)b->start;
   }
   
  -APR_EXPORT(ap_bucket *) ap_rmem_create(void)
  -{
  -    ap_bucket *newbuf;
  -    ap_bucket_rmem *b;
  -
  -    newbuf                = malloc(sizeof(*newbuf));
  -    b                     = malloc(sizeof(*b)); 
  -
  -    b->alloc_len          = 0;
  -    b->start = b->end     = NULL;
  -
  -    newbuf->color         = AP_BUCKET_rmem;
  -    newbuf->getstr        = rmem_get_str;
  -    newbuf->getlen        = rmem_get_len;
  -    newbuf->free          = NULL;
  -    newbuf->data          = b;
  -    return newbuf;
  -}
  -
   /*
    * save nbyte bytes to the bucket.
    * Only returns fewer than nbyte if an error ocurred.
  @@ -101,11 +82,13 @@
    * It is worth noting that if an error occurs, the buffer is in an unknown
    * state.
    */
  -APR_EXPORT(int) ap_rmem_write(ap_bucket_rmem *b, const void *buf,
  -                               ap_size_t nbyte, ap_ssize_t *bytes_written)
  +static ap_status_t rmem_insert(ap_bucket *e, const void *buf,
  +                               ap_size_t nbyte, ap_ssize_t *w)
   {
  +    ap_bucket_rmem *b = (ap_bucket_rmem *)e->data;
  +
       if (nbyte == 0) {
  -        *bytes_written = 0;
  +        *w = 0;
           return APR_SUCCESS;
       }
   
  @@ -114,7 +97,27 @@
        */
       b->start = buf;
       b->end = (char *)b->start + nbyte;
  -    *bytes_written = nbyte;
  +    *w = nbyte;
       return APR_SUCCESS;
  +}
  +
  +APR_EXPORT(ap_bucket *) ap_rmem_create(void)
  +{
  +    ap_bucket *newbuf;
  +    ap_bucket_rmem *b;
  +
  +    newbuf                = malloc(sizeof(*newbuf));
  +    b                     = malloc(sizeof(*b)); 
  +
  +    b->alloc_len          = 0;
  +    b->start = b->end     = NULL;
  +
  +    newbuf->color         = AP_BUCKET_rmem;
  +    newbuf->getstr        = rmem_get_str;
  +    newbuf->getlen        = rmem_get_len;
  +    newbuf->insert        = rmem_insert;
  +    newbuf->free          = NULL;
  +    newbuf->data          = b;
  +    return newbuf;
   }
   
  
  
  
  1.5       +25 -45    apache-2.0/src/lib/apr/buckets/ap_rwmem_buf.c
  
  Index: ap_rwmem_buf.c
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/lib/apr/buckets/ap_rwmem_buf.c,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- ap_rwmem_buf.c	2000/07/13 21:48:33	1.4
  +++ ap_rwmem_buf.c	2000/07/14 00:24:33	1.5
  @@ -81,28 +81,6 @@
       free(d->alloc_addr);
   }
   
  -APR_EXPORT(ap_bucket *) ap_rwmem_create(void)
  -{
  -    ap_bucket *newbuf;
  -    ap_bucket_rwmem *b;
  -
  -    newbuf = malloc(sizeof(*newbuf));
  -    b = malloc(sizeof(*b));
  -    
  -    b->alloc_addr = calloc(DEFAULT_RWBUF_SIZE, 1);
  -    b->alloc_len  = DEFAULT_RWBUF_SIZE;
  -    b->start      = b->alloc_addr;
  -    b->end        = b->alloc_addr;
  -
  -    newbuf->color      = AP_BUCKET_rwmem;
  -    newbuf->getstr     = rwmem_get_str;
  -    newbuf->getlen     = rwmem_get_len;
  -    newbuf->free       = rwmem_destroy;
  -    newbuf->data       = b;
  -
  -    return newbuf;
  -}
  -
   /*
    * save nbyte bytes to the bucket.
    * Only returns fewer than nbyte if an error occurred.
  @@ -110,14 +88,15 @@
    * It is worth noting that if an error occurs, the buffer is in an unknown
    * state.
    */
  -APR_EXPORT(int) ap_rwmem_write(ap_bucket_rwmem *b, const void *buf,
  -                               ap_size_t nbyte, ap_ssize_t *bytes_written)
  +static ap_status_t rwmem_insert(ap_bucket *e, const void *buf,
  +                                ap_size_t nbyte, ap_ssize_t *w)
   {
       int amt;
       int total;
  +    ap_bucket_rwmem *b = (ap_bucket_rwmem *)e->data;
   
       if (nbyte == 0) {
  -        *bytes_written = 0;
  +        *w = 0;
           return APR_SUCCESS;
       }
   
  @@ -136,29 +115,30 @@
       /* now we know that nbyte < b->alloc_len */
       memcpy(b->end, buf, nbyte);
       b->end = (char *)b->end + nbyte;
  -    *bytes_written = total + nbyte;
  +    *w = total + nbyte;
       return APR_SUCCESS;
   }
   
  -APR_EXPORT(int) ap_rwmem_vputstrs(ap_bucket_rwmem *b, va_list va)
  +APR_EXPORT(ap_bucket *) ap_rwmem_create(void)
   {
  -    int j, k;
  -    ap_ssize_t i;
  -    const char *x;
  -    int rv;
  -
  -    for (k = 0;;) {
  -        x = va_arg(va, const char *);
  -        if (x == NULL)
  -            break;
  -        j = strlen(x);
  -        rv = ap_rwmem_write(b, x, j, &i);
  -        if (i != j) {
  -            /* Do we need better error reporting?  */
  -            return -1;
  -        }
  -        k += i;
  -    }
  +    ap_bucket *newbuf;
  +    ap_bucket_rwmem *b;
   
  -    return k;
  +    newbuf = malloc(sizeof(*newbuf));
  +    b = malloc(sizeof(*b));
  +    
  +    b->alloc_addr = calloc(DEFAULT_RWBUF_SIZE, 1);
  +    b->alloc_len  = DEFAULT_RWBUF_SIZE;
  +    b->start      = b->alloc_addr;
  +    b->end        = b->alloc_addr;
  +
  +    newbuf->color      = AP_BUCKET_rwmem;
  +    newbuf->getstr     = rwmem_get_str;
  +    newbuf->getlen     = rwmem_get_len;
  +    newbuf->insert     = rwmem_insert;
  +    newbuf->free       = rwmem_destroy;
  +    newbuf->data       = b;
  +
  +    return newbuf;
   }
  +
  
  
  
  1.13      +39 -43    apache-2.0/src/lib/apr/buckets/apr_buf.h
  
  Index: apr_buf.h
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/lib/apr/buckets/apr_buf.h,v
  retrieving revision 1.12
  retrieving revision 1.13
  diff -u -r1.12 -r1.13
  --- apr_buf.h	2000/07/13 21:48:34	1.12
  +++ apr_buf.h	2000/07/14 00:24:33	1.13
  @@ -86,6 +86,15 @@
       void *data;				  /* for use by free() */
       const char *(*getstr)(ap_bucket *e);  /* Get the string */
       int (*getlen)(ap_bucket *e);          /* Get the length of the string */
  +    /* Insert into a bucket.  The buf is a different type based on the
  +     * bucket type used.  For example, with AP_BUCKET_mmap it is an ap_mmap_t
  +     * for AP_BUCKET_file it is an ap_file_t, and for AP_BUCKET_rwmem it is
  +     * a char *.  The nbytes is the amount of actual data in buf.  This is
  +     * not the sizeof(buf), it is the actual number of bytes in the char *
  +     * that buf resolves to.  written is how much of that data was inserted
  +     * into the bucket.
  +     */ 
  +    int (*insert)(ap_bucket *e, const void *buf, ap_size_t nbytes, ap_ssize_t *w);
   };
   
   typedef struct ap_bucket_list ap_bucket_list;
  @@ -106,6 +115,35 @@
       ap_bucket_list *tail;               /* The end of the brigade */
   };
   
  +/*    ******  Different bucket types   *****/
  +
  +typedef struct ap_bucket_rmem ap_bucket_rmem;
  +struct ap_bucket_rmem {
  +    size_t  alloc_len;                  /* how much was allocated */
  +    const void    *start;               /* Where does the actual data start
  +                                           in the alloc'ed block */
  +    const void    *end;                 /* where does the data actually end? */
  +};
  +
  +typedef struct ap_bucket_rwmem ap_bucket_rwmem;
  +struct ap_bucket_rwmem {
  +    void    *alloc_addr;                /* Where does the data start */
  +    size_t  alloc_len;                  /* how much was allocated */
  +    void    *start;                     /* Where does the actual data start
  +                                           in the alloc'ed block */
  +    void    *end;                       /* where does the data actually end? */
  +};
  +
  +typedef struct ap_bucket_mmap ap_bucket_mmap;
  +struct ap_bucket_mmap {
  +    const ap_mmap_t *data;
  +    int       len;           /* The amount of data in the mmap that we are 
  +                              * referencing with this bucket.  This may be 
  +                              * smaller than the length in the data object, 
  +                              * but it may not be bigger.
  +                              */
  +};
  +
   /*   ******  Bucket Brigade Functions  *****  */
   
   /* Create a new bucket brigade */
  @@ -173,56 +211,14 @@
   /* get the length of the data in the bucket */
   APR_EXPORT(int) ap_get_bucket_len(ap_bucket *b);
   
  -/*   ******  RWMEM Functions  *****  */
  -
  -typedef struct ap_bucket_rwmem ap_bucket_rwmem;
  -struct ap_bucket_rwmem {
  -    void    *alloc_addr;                /* Where does the data start */
  -    size_t  alloc_len;                  /* how much was allocated */
  -    void    *start;                     /* Where does the actual data start
  -                                           in the alloc'ed block */
  -    void    *end;                       /* where does the data actually end? */
  -};
  -
   /* Create a read/write memory bucket */
   APR_EXPORT(ap_bucket *) ap_rwmem_create(void);
   
  -APR_EXPORT(int) ap_rwmem_write(ap_bucket_rwmem *b, const void *buf,
  -                               ap_size_t nbyte, ap_ssize_t *bytes_written);
  -
  -APR_EXPORT(int) ap_rwmem_vputstrs(ap_bucket_rwmem *b, va_list va);
  -
  -/*   ******  MMAP Functions  *****  */
  -
  -typedef struct ap_bucket_mmap ap_bucket_mmap;
  -struct ap_bucket_mmap {
  -    ap_mmap_t *data;
  -};
  -
   /* Create a mmap memory bucket */
   APR_EXPORT(ap_bucket *) ap_mmap_bucket_create(void);
   
  -APR_EXPORT(void) ap_mmap_bucket_insert(ap_bucket_mmap *b, ap_mmap_t *mm);
  -
  -/*   ******  RMEM Functions  *****  */
  -
  -typedef struct ap_bucket_rmem ap_bucket_rmem;
  -struct ap_bucket_rmem {
  -    size_t  alloc_len;                  /* how much was allocated */
  -    const void    *start;               /* Where does the actual data start
  -                                           in the alloc'ed block */
  -    const void    *end;                 /* where does the data actually end? */
  -};
  -
  -/* Create a read only memory bucket */
  +/* Create a read only memory bucket. */
   APR_EXPORT(ap_bucket *) ap_rmem_create(void);
  -
  -APR_EXPORT(int) ap_rmem_write(ap_bucket_rmem *b, const void *buf,
  -                               ap_size_t nbyte, ap_ssize_t *bytes_written);
  -
  -APR_EXPORT(int) ap_rmem_vputstrs(ap_bucket_rmem *b, va_list va);
  -
  -/*   ******  RMEM Functions  *****  */
   
   /* Create an End of Stream bucket */
   APR_EXPORT(ap_bucket *) ap_eos_create(void);