You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by hg...@apache.org on 2001/05/03 16:31:14 UTC
cvs commit: jakarta-tomcat/proposals/web-connector/native/common jk_pool.c jk_pool.h
hgomez 01/05/03 07:31:14
Added: proposals/web-connector/native/common jk_pool.c jk_pool.h
Log:
memory pool
Revision Changes Path
1.1 jakarta-tomcat/proposals/web-connector/native/common/jk_pool.c
Index: jk_pool.c
===================================================================
/*
* Copyright (c) 1997-1999 The Java Apache Project. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. All advertising materials mentioning features or use of this
* software must display the following acknowledgment:
* "This product includes software developed by the Java Apache
* Project for use in the Apache JServ servlet engine project
* <http://java.apache.org/>."
*
* 4. The names "Apache JServ", "Apache JServ Servlet Engine" and
* "Java Apache Project" must not be used to endorse or promote products
* derived from this software without prior written permission.
*
* 5. Products derived from this software may not be called "Apache JServ"
* nor may "Apache" nor "Apache JServ" appear in their names without
* prior written permission of the Java Apache Project.
*
* 6. Redistributions of any form whatsoever must retain the following
* acknowledgment:
* "This product includes software developed by the Java Apache
* Project for use in the Apache JServ servlet engine project
* <http://java.apache.org/>."
*
* THIS SOFTWARE IS PROVIDED BY THE JAVA APACHE PROJECT "AS IS" AND ANY
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JAVA APACHE PROJECT OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Java Apache Group. For more information
* on the Java Apache Project and the Apache JServ Servlet Engine project,
* please see <http://java.apache.org/>.
*
*/
/***************************************************************************
* Description: Simple memory pool *
* Author: Gal Shachor <sh...@il.ibm.com> *
* Version: $Revision: 1.1 $ *
***************************************************************************/
#include "jk_pool.h"
static void *jk_pool_dyn_alloc(jk_pool_t *p,
size_t size);
void jk_open_pool(jk_pool_t *p,
jk_pool_atom_t *buf,
unsigned size)
{
p->pos = 0;
p->size = size;
p->buf = (char *)buf;
p->dyn_pos = 0;
p->dynamic = NULL;
p->dyn_size = 0;
}
void jk_close_pool(jk_pool_t *p)
{
if(p) {
jk_reset_pool(p);
if(p->dynamic) {
free(p->dynamic);
}
}
}
void jk_reset_pool(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]);
}
}
}
p->dyn_pos = 0;
p->pos = 0;
}
void *jk_pool_alloc(jk_pool_t *p,
size_t size)
{
void *rc = NULL;
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);
}
}
return rc;
}
void *jk_pool_realloc(jk_pool_t *p,
size_t sz,
const void *old,
size_t old_sz)
{
void *rc;
if(!p || (!old && old_sz)) {
return NULL;
}
rc = jk_pool_alloc(p, sz);
if(rc) {
memcpy(rc, old, old_sz);
}
return rc;
}
void *jk_pool_strdup(jk_pool_t *p,
const char *s)
{
char *rc = NULL;
if(s && p) {
size_t size = strlen(s);
if(!size) {
return "";
}
size++;
rc = jk_pool_alloc(p, size);
if(rc) {
memcpy(rc, s, size);
}
}
return rc;
}
void jk_dump_pool(jk_pool_t *p,
FILE *f)
{
fprintf(f, "Dumping for pool [%x]\n", p);
fprintf(f, "size [%d]\n", p->size);
fprintf(f, "pos [%d]\n", p->pos);
fprintf(f, "buf [%x]\n", p->buf);
fprintf(f, "dyn_size [%d]\n", p->dyn_size);
fprintf(f, "dyn_pos [%d]\n", p->dyn_pos);
fprintf(f, "dynamic [%x]\n", p->dynamic);
fflush(f);
}
static void *jk_pool_dyn_alloc(jk_pool_t *p,
size_t size)
{
void *rc = NULL;
if(p->dyn_size == p->dyn_pos) {
unsigned new_dyn_size = p->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 {
return NULL;
}
}
rc = p->dynamic[p->dyn_pos] = malloc(size);
if(p->dynamic[p->dyn_pos]) {
p->dyn_pos ++;
}
return rc;
}
1.1 jakarta-tomcat/proposals/web-connector/native/common/jk_pool.h
Index: jk_pool.h
===================================================================
/*
* Copyright (c) 1997-1999 The Java Apache Project. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. All advertising materials mentioning features or use of this
* software must display the following acknowledgment:
* "This product includes software developed by the Java Apache
* Project for use in the Apache JServ servlet engine project
* <http://java.apache.org/>."
*
* 4. The names "Apache JServ", "Apache JServ Servlet Engine" and
* "Java Apache Project" must not be used to endorse or promote products
* derived from this software without prior written permission.
*
* 5. Products derived from this software may not be called "Apache JServ"
* nor may "Apache" nor "Apache JServ" appear in their names without
* prior written permission of the Java Apache Project.
*
* 6. Redistributions of any form whatsoever must retain the following
* acknowledgment:
* "This product includes software developed by the Java Apache
* Project for use in the Apache JServ servlet engine project
* <http://java.apache.org/>."
*
* THIS SOFTWARE IS PROVIDED BY THE JAVA APACHE PROJECT "AS IS" AND ANY
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JAVA APACHE PROJECT OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Java Apache Group. For more information
* on the Java Apache Project and the Apache JServ Servlet Engine project,
* please see <http://java.apache.org/>.
*
*/
/***************************************************************************
* Description: Memory Pool object header file *
* Author: Gal Shachor <sh...@il.ibm.com> *
* Version: $Revision: 1.1 $ *
***************************************************************************/
#ifndef _JK_POOL_H
#define _JK_POOL_H
#include "jk_global.h"
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
#define DEFAULT_DYNAMIC 10
/*
* The pool atom (basic pool alocation unit) is an 8 byte long.
* Each allocation (even for 1 byte) will return a round up to the
* number of atoms.
*
* This is to help in alignment of 32/64 bit machines ...
* G.S
*/
#ifdef WIN32
typedef __int64 jk_pool_atom_t;
#elif defined(AIX)
typedef long long jk_pool_atom_t;
#elif defined(SOLARIS)
typedef long long jk_pool_atom_t;
#elif defined(LINUX)
typedef long long jk_pool_atom_t;
#elif defined(FREEBSD)
typedef long long jk_pool_atom_t;
#elif defined(OS2)
typedef long long jk_pool_atom_t;
#elif defined(NETWARE)
typedef long long jk_pool_atom_t;
#elif defined(HPUX11)
typedef long long jk_pool_atom_t;
#elif defined(IRIX)
typedef long long jk_pool_atom_t;
#else
typedef long long jk_pool_atom_t;
#endif
/*
* Pool size in number of pool atoms.
*/
#define TINY_POOL_SIZE 256 /* Tiny 1/4K atom pool. */
#define SMALL_POOL_SIZE 512 /* Small 1/2K atom pool. */
#define BIG_POOL_SIZE 2*SMALL_POOL_SIZE /* Bigger 1K atom pool. */
#define HUGE_POOL_SIZE 2*BIG_POOL_SIZE /* Huge 2K atom pool. */
struct jk_pool {
unsigned size;
unsigned pos;
char *buf;
unsigned dyn_size;
unsigned dyn_pos;
void **dynamic;
};
typedef struct jk_pool jk_pool_t;
void jk_open_pool(jk_pool_t *p,
jk_pool_atom_t *buf,
unsigned size);
void jk_close_pool(jk_pool_t *p);
void jk_reset_pool(jk_pool_t *p);
void *jk_pool_alloc(jk_pool_t *p,
size_t sz);
void *jk_pool_realloc(jk_pool_t *p,
size_t sz,
const void *old,
size_t old_sz);
void *jk_pool_strdup(jk_pool_t *p,
const char *s);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* _JK_POOL_H */