⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jk_pool.c

📁 jboss与apache集成的中间件,详情请参看文档说明.
💻 C
字号:
/* *  Copyright 1999-2004 The Apache Software Foundation * *  Licensed under the Apache License, Version 2.0 (the "License"); *  you may not use this file except in compliance with the License. *  You may obtain a copy of the License at * *      http://www.apache.org/licenses/LICENSE-2.0 * *  Unless required by applicable law or agreed to in writing, software *  distributed under the License is distributed on an "AS IS" BASIS, *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *  See the License for the specific language governing permissions and *  limitations under the License. *//*************************************************************************** * Description: Simple memory pool                                         * * Author:      Gal Shachor <shachor@il.ibm.com>                           * * Version:     $Revision: 1.14 $                                           * ***************************************************************************/#include "jk_pool.h"#define DEFAULT_DYNAMIC 10static 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, size_t 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){    jk_reset_pool(p);    if (p->dynamic) {        free(p->dynamic);    }}void jk_reset_pool(jk_pool_t *p){    if (p->dyn_pos && p->dynamic) {        size_t 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;    size = JK_ALIGN_DEFAULT(size);    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){    void *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;}#if defined (DEBUG) || defined(_DEBUG)static void jk_dump_pool(jk_pool_t *p, FILE * f){    fprintf(f, "Dumping for pool [%p]\n",  p);    fprintf(f, "size             [%ld]\n", p->size);    fprintf(f, "pos              [%ld]\n", p->pos);    fprintf(f, "buf              [%p]\n",  p->buf);    fprintf(f, "dyn_size         [%ld]\n", p->dyn_size);    fprintf(f, "dyn_pos          [%ld]\n", p->dyn_pos);    fprintf(f, "dynamic          [%p]\n",  p->dynamic);    fflush(f);}#endifstatic void *jk_pool_dyn_alloc(jk_pool_t *p, size_t size){    void *rc;    if (p->dyn_size == p->dyn_pos) {        size_t new_dyn_size = p->dyn_size * 2 + DEFAULT_DYNAMIC;        void **new_dynamic = (void **)malloc(new_dyn_size * sizeof(void *));        if (new_dynamic) {            if (p->dynamic) {                /* Copy old dynamic slots */                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 defined (DEBUG) || defined(_DEBUG)            jk_dump_pool(p, stderr);#endif                        return NULL;        }    }    rc = p->dynamic[p->dyn_pos] = malloc(size);    if (p->dynamic[p->dyn_pos]) {        p->dyn_pos++;    }    return rc;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -