costin      01/12/06 14:59:03

  Modified:    jk/native2/common jk_pool.c
  Log:
  Moved the private data inside.
  
  It compiles and seems to work fine - but for now it's not enabled, I want to
  test APR pools.
  
  When I start porting the other server adapters ( hopefully next week I'll be done
  with most refactoring ) I'll go back to test the 'common' pool.
  
  Revision  Changes    Path
  1.4       +159 -103  jakarta-tomcat-connectors/jk/native2/common/jk_pool.c
  
  Index: jk_pool.c
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/common/jk_pool.c,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- jk_pool.c 2001/12/05 20:48:20     1.3
  +++ jk_pool.c 2001/12/06 22:59:03     1.4
  @@ -58,56 +58,144 @@
   /***************************************************************************
    * Description: Simple memory pool                                         *
    * Author:      Gal Shachor <[EMAIL PROTECTED]>                           *
  - * Version:     $Revision: 1.3 $                                           *
  + * Version:     $Revision: 1.4 $                                           *
    ***************************************************************************/
   
   #include "jk_pool.h"
   #include "jk_env.h"
   
   #define DEFAULT_DYNAMIC 10
  +#define JK_DEBUG_POOL 1
   
  +/* Private data for jk pools
  + */
  +struct jk_pool_private {
  +    jk_pool_t *parent;    
  +    int size;      
  +    int pos;       
  +    int dyn_size;  
  +    int dyn_pos;   
  +    void     **dynamic;
  +    char  *buf;
  +};
  +
  +typedef struct jk_pool_private jk_pool_private_t;
  +
  +int jk_pool_create( jk_pool_t **newPool, jk_pool_t *parent, int size );
  +
   int JK_METHOD jk_pool_factory( jk_env_t *env, void **result,
                                  char *type, char *name);
   
  +static jk_pool_t *jk_pool_createChild( jk_pool_t *parent, int size );
  +
   static void *jk_pool_dyn_alloc(jk_pool_t *p, 
                                  size_t size);
   
  -static void jk_reset_pool(jk_pool_t *p);
  +static void jk_pool_reset(jk_pool_t *p);
   
  -static void jk_close_pool(jk_pool_t *p);
  +static void jk_pool_close(jk_pool_t *p);
   
  -static void *jk_pool_alloc(jk_pool_t *p, 
  -                           size_t size);
  +static void *jk_pool_alloc(jk_pool_t *p, size_t size);
  +
  +static void *jk_pool_calloc(jk_pool_t *p, size_t size);
  +
  +static void *jk_pool_strdup(jk_pool_t *p, const char *s);
  +
  +static void *jk_pool_realloc(jk_pool_t *p, size_t sz,const void *old,
  +                             size_t old_sz);
  +
  +
  +int jk_pool_create( jk_pool_t **newPool, jk_pool_t *parent, int size ) {
  +    jk_pool_private_t *pp;
  +    
  +    jk_pool_t *_this=(jk_pool_t *)malloc( sizeof( jk_pool_t ));
  +    /*     jk_pool_t *_this=(jk_pool_t *)malloc( sizeof( jk_pool_t ) + */
  +    /*                                           sizeof( jk_pool_private_t ) +*/
  +    /*                                           size ); */
  +    pp=(jk_pool_private_t *)malloc( sizeof( jk_pool_private_t ));
  +    
  +    _this->_private=pp;
  +
  +    /* XXX strange, but I assume the size is in bytes, not atom_t */
  +    pp->buf=(char *)malloc( size );
  +
  +    pp->pos  = 0;
  +    pp->size = size;
  +
  +    pp->dyn_pos = 0;
  +    pp->dynamic = NULL;
  +    pp->dyn_size = 0;
  +    pp->parent=parent;
  +
  +    /* methods */
  +    _this->create=jk_pool_createChild;
  +    _this->close=jk_pool_close;
  +    _this->reset=jk_pool_reset;
  +    
  +    _this->alloc=jk_pool_alloc;
  +    _this->calloc=jk_pool_calloc;
  +    _this->pstrdup=jk_pool_strdup;
  +    _this->realloc=jk_pool_realloc;
  +    
  +    *newPool = _this;
  +    
  +    return JK_TRUE;
  +}
   
  -static void jk_close_pool(jk_pool_t *p)
  +static jk_pool_t *jk_pool_createChild( jk_pool_t *parent, int size ) {
  +    jk_pool_t *newPool;
  +    
  +    jk_pool_create( &newPool, parent, size );
  +    return newPool;
  +}
  +
  +static void jk_pool_close(jk_pool_t *p)
   {
  -    if(p) {
  -        jk_reset_pool(p);
  -        if(p->dynamic) {
  -            free(p->dynamic);
  -        }
  +    jk_pool_private_t *pp;
  +    
  +    if(p==NULL || p->_private==NULL)
  +        return;
  +
  +    pp=(jk_pool_private_t *)p->_private;
  +    
  +    jk_pool_reset(p);
  +    if(pp->dynamic) {
  +        free(pp->dynamic);
       }
  +    if( pp->buf )
  +        free( pp->buf );
  +    free( pp );
  +    free( p );
   }
   
  -static void jk_reset_pool(jk_pool_t *p)
  +static void jk_pool_reset(jk_pool_t *p)
   {
  -    if(p && p->dyn_pos && p->dynamic) {
  -        unsigned i;
  -        for(i = 0 ; i < p->dyn_pos ; i++) {
  -            if(p->dynamic[i]) {
  -                free(p->dynamic[i]);
  +    jk_pool_private_t *pp;
  +    
  +    if(p==NULL || p->_private ==NULL )
  +        return;
  +
  +    pp=(jk_pool_private_t *)p->_private;
  +
  +    if( pp->dyn_pos && pp->dynamic) {
  +        int i;
  +        for(i = 0 ; i < pp->dyn_pos ; i++) {
  +            if(pp->dynamic[i]) {
  +                free(pp->dynamic[i]);
               }
           }
       }
   
  -    p->dyn_pos  = 0;
  -    p->pos      = 0;
  +    pp->dyn_pos  = 0;
  +    pp->pos      = 0;
   }
   
   static void *jk_pool_calloc(jk_pool_t *p, 
  -                           size_t size)
  +                            size_t size)
   {
       void *rc=jk_pool_alloc( p, size );
  +    if( rc==NULL )
  +        return NULL;
       memset( rc, 0, size );
       return rc;
   }
  @@ -116,26 +204,33 @@
                              size_t size)
   {
       void *rc = NULL;
  +    jk_pool_private_t *pp;
   
  -    if(p && size > 0) {
  -        /* Round size to the upper mult of 8. */
  -        size -= 1;
  -        size /= 8;
  -        size = (size + 1) * 8;
  -        if((p->size - p->pos) >= size) {
  -            rc = &(p->buf[p->pos]);
  -            p->pos += size;
  -        } else {
  -            rc = jk_pool_dyn_alloc(p, size);
  -        }
  +    if(p==NULL || size <= 0)
  +        return NULL;
  +
  +    pp=(jk_pool_private_t *)p->_private;
  +
  +    /* Round size to the upper mult of 8. */
  +    size -= 1;
  +    size /= 8;
  +    size = (size + 1) * 8;
  +
  +    if((pp->size - pp->pos) >= (int)size) {
  +        /* We have space */
  +        rc = &(pp->buf[pp->pos]);
  +        pp->pos += size;
  +    } else {
  +#ifdef JK_DEBUG_POOL
  +        printf("Dynamic alloc %d\n", pp->size );
  +#endif
  +        rc = jk_pool_dyn_alloc(p, size);
       }
   
       return rc;
   }
   
  -static void *jk_pool_realloc(jk_pool_t *p, 
  -                             size_t sz,
  -                             const void *old,
  +static void *jk_pool_realloc(jk_pool_t *p, size_t sz,const void *old,
                                size_t old_sz)
   {
       void *rc;
  @@ -143,17 +238,15 @@
       if(!p || (!old && old_sz)) {
           return NULL;
       }
  -
       rc = jk_pool_alloc(p, sz);
  -    if(rc) {
  -        memcpy(rc, old, old_sz);
  -    }
  +    if(rc==NULL)
  +        return NULL;
   
  +    memcpy(rc, old, old_sz);
       return rc;
   }
   
  -static void *jk_pool_strdup(jk_pool_t *p, 
  -                            const char *s)
  +static void *jk_pool_strdup(jk_pool_t *p, const char *s)
   {
       char *rc = NULL;
       if(s && p) {
  @@ -163,8 +256,7 @@
               return "";
           }
   
  -        size++;
  -        rc = jk_pool_alloc(p, size);
  +        rc = jk_pool_alloc(p, size+1);
           if(rc) {
               memcpy(rc, s, size);
           }
  @@ -173,8 +265,9 @@
       return rc;
   }
   
  -static void jk_dump_pool(jk_pool_t *p, 
  -                  FILE *f)
  +/*
  +  static void jk_dump_pool(jk_pool_t *p, 
  +                         FILE *f)
   {
       fprintf(f, "Dumping for pool [%p]\n", p);
       fprintf(f, "size             [%d]\n", p->size);
  @@ -186,61 +279,41 @@
   
       fflush(f);
   }
  +*/
   
  -static void *jk_pool_dyn_alloc(jk_pool_t *p, 
  -                               size_t size)
  +static void *jk_pool_dyn_alloc(jk_pool_t *p, size_t size)
  +
   {
       void *rc = NULL;
  +    jk_pool_private_t *pp;
  +    pp=(jk_pool_private_t *)p->_private;
   
  -    if(p->dyn_size == p->dyn_pos) {
  -        unsigned new_dyn_size = p->dyn_size + DEFAULT_DYNAMIC;
  +    if(pp->dyn_size == pp->dyn_pos) {
  +        int new_dyn_size = pp->dyn_size + DEFAULT_DYNAMIC;
           void **new_dynamic = (void **)malloc(new_dyn_size * sizeof(void *));
  -        if(new_dynamic) {
  -            if(p->dynamic) {
  -                memcpy(new_dynamic, 
  -                       p->dynamic, 
  -                       p->dyn_size * sizeof(void *));
  -
  -                free(p->dynamic);
  -            }
  -
  -            p->dynamic = new_dynamic;
  -            p->dyn_size = new_dyn_size;
  -        } else {
  +        if(new_dynamic==NULL) {
               return NULL;
           }
  +
  +        if(pp->dynamic) {
  +            memcpy(new_dynamic, 
  +                   pp->dynamic, 
  +                   pp->dyn_size * sizeof(void *));
  +            
  +            free(pp->dynamic);
  +        }
  +
  +        pp->dynamic = new_dynamic;
  +        pp->dyn_size = new_dyn_size;
       } 
   
  -    rc = p->dynamic[p->dyn_pos] = malloc(size);
  -    if(p->dynamic[p->dyn_pos]) {
  -        p->dyn_pos ++;
  +    rc = pp->dynamic[pp->dyn_pos] = malloc(size);
  +    if(pp->dynamic[pp->dyn_pos]) {
  +        pp->dyn_pos ++;
       }
  -
       return rc;
   }
   
  -/* Not implemented yet */
  -int jk_pool_create( jk_pool_t **newPool, jk_pool_t *parent, int size ) {
  -    jk_pool_t *_this=(jk_pool_t *)malloc( sizeof( jk_pool_t ));
  -
  -    /* XXX strange, but I assume the size is in bytes, not atom_t */
  -    _this->buf=(jk_pool_atom_t *)malloc( size );
  -    jk_open_pool( _this, _this->buf, size );
  -    _this->own_buffer = JK_TRUE;
  -    *newPool = _this;
  -    
  -    return JK_TRUE;
  -}
  -
  -static void init_methods(jk_pool_t *_this ) {
  -    _this->open=jk_open_pool;
  -    _this->close=jk_close_pool;
  -    _this->reset=jk_reset_pool;
  -    _this->alloc=jk_pool_alloc;
  -    _this->calloc=jk_pool_calloc;
  -    _this->pstrdup=jk_pool_strdup;
  -    _this->realloc=jk_pool_realloc;
  -}
   
   /* Not used yet */
   int JK_METHOD jk_pool_factory( jk_env_t *env, void **result,
  @@ -248,27 +321,10 @@
   {
       jk_pool_t *_this=(jk_pool_t *)calloc( 1, sizeof(jk_pool_t));
   
  -    init_methods(_this );
  -
       *result=_this;
       
       return JK_TRUE;
   }
   
  -/* that's what jk use to create pools. Deprecated! */
  -void jk_open_pool(jk_pool_t *_this,
  -                  jk_pool_atom_t *buf,
  -                  unsigned size)
  -{
  -    _this->pos  = 0;
  -    _this->size = size;
  -    _this->buf  = buf;
  -
  -    _this->dyn_pos = 0;
  -    _this->dynamic = NULL;
  -    _this->dyn_size = 0;
  -    _this->own_buffer = JK_FALSE;
  -    init_methods( _this );
  -}
   
   
  
  
  

--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to