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]>