00001 /* ==================================================================== 00002 * The Kannel Software License, Version 1.0 00003 * 00004 * Copyright (c) 2001-2008 Kannel Group 00005 * Copyright (c) 1998-2001 WapIT Ltd. 00006 * All rights reserved. 00007 * 00008 * Redistribution and use in source and binary forms, with or without 00009 * modification, are permitted provided that the following conditions 00010 * are met: 00011 * 00012 * 1. Redistributions of source code must retain the above copyright 00013 * notice, this list of conditions and the following disclaimer. 00014 * 00015 * 2. Redistributions in binary form must reproduce the above copyright 00016 * notice, this list of conditions and the following disclaimer in 00017 * the documentation and/or other materials provided with the 00018 * distribution. 00019 * 00020 * 3. The end-user documentation included with the redistribution, 00021 * if any, must include the following acknowledgment: 00022 * "This product includes software developed by the 00023 * Kannel Group (http://www.kannel.org/)." 00024 * Alternately, this acknowledgment may appear in the software itself, 00025 * if and wherever such third-party acknowledgments normally appear. 00026 * 00027 * 4. The names "Kannel" and "Kannel Group" must not be used to 00028 * endorse or promote products derived from this software without 00029 * prior written permission. For written permission, please 00030 * contact org@kannel.org. 00031 * 00032 * 5. Products derived from this software may not be called "Kannel", 00033 * nor may "Kannel" appear in their name, without prior written 00034 * permission of the Kannel Group. 00035 * 00036 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED 00037 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 00038 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 00039 * DISCLAIMED. IN NO EVENT SHALL THE KANNEL GROUP OR ITS CONTRIBUTORS 00040 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, 00041 * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT 00042 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 00043 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 00044 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 00045 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 00046 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00047 * ==================================================================== 00048 * 00049 * This software consists of voluntary contributions made by many 00050 * individuals on behalf of the Kannel Group. For more information on 00051 * the Kannel Group, please see <http://www.kannel.org/>. 00052 * 00053 * Portions of this software are based upon software originally written at 00054 * WapIT Ltd., Helsinki, Finland for the Kannel project. 00055 */ 00056 00057 /* 00058 * 00059 * wsfalloc.c 00060 * 00061 * Author: Markku Rossi <mtr@iki.fi> 00062 * 00063 * Copyright (c) 1999-2000 WAPIT OY LTD. 00064 * All rights reserved. 00065 * 00066 * Fast memory allocation routines. 00067 * 00068 */ 00069 00070 #include "wsint.h" 00071 00072 /********************* Global functions *********************************/ 00073 00074 WsFastMalloc *ws_f_create(size_t block_size) 00075 { 00076 WsFastMalloc *pool = ws_calloc(1, sizeof(WsFastMalloc)); 00077 00078 if (pool == NULL) 00079 return NULL; 00080 00081 pool->block_size = block_size; 00082 00083 return pool; 00084 } 00085 00086 00087 void ws_f_destroy(WsFastMalloc *pool) 00088 { 00089 WsFastMallocBlock *b, *bnext; 00090 00091 if (pool == NULL) 00092 return; 00093 00094 for (b = pool->blocks; b; b = bnext) { 00095 bnext = b->next; 00096 ws_free(b); 00097 } 00098 ws_free(pool); 00099 } 00100 00101 00102 void *ws_f_malloc(WsFastMalloc *pool, size_t size) 00103 { 00104 unsigned char *result; 00105 00106 /* Keep the blocks aligned, because this function is used to allocate 00107 * space for structures containing longs and such. */ 00108 00109 if (size % sizeof(long) != 0) { 00110 size += sizeof(long) - (size % sizeof(long)); 00111 } 00112 00113 if (pool->size < size) { 00114 size_t alloc_size; 00115 WsFastMallocBlock *b; 00116 00117 /* Must allocate a fresh block. */ 00118 alloc_size = pool->block_size; 00119 if (alloc_size < size) 00120 alloc_size = size; 00121 00122 /* Allocate the block and remember to add the header size. */ 00123 b = ws_malloc(alloc_size + sizeof(WsFastMallocBlock)); 00124 00125 if (b == NULL) 00126 /* No memory available. */ 00127 return NULL; 00128 00129 /* Add this block to the memory pool. */ 00130 b->next = pool->blocks; 00131 pool->blocks = b; 00132 00133 pool->ptr = ((unsigned char *) b) + sizeof(WsFastMallocBlock); 00134 pool->size = alloc_size; 00135 } 00136 00137 /* Now we can allocate `size' bytes of data from this pool. */ 00138 00139 result = pool->ptr; 00140 00141 pool->ptr += size; 00142 pool->size -= size; 00143 00144 pool->user_bytes_allocated += size; 00145 00146 return result; 00147 } 00148 00149 00150 void *ws_f_calloc(WsFastMalloc *pool, size_t num, size_t size) 00151 { 00152 void *p = ws_f_malloc(pool, num * size); 00153 00154 if (p == NULL) 00155 return p; 00156 00157 memset(p, 0, num * size); 00158 00159 return p; 00160 } 00161 00162 00163 void *ws_f_memdup(WsFastMalloc *pool, const void *ptr, size_t size) 00164 { 00165 unsigned char *d = ws_f_malloc(pool, size + 1); 00166 00167 if (d == NULL) 00168 return NULL; 00169 00170 memcpy(d, ptr, size); 00171 d[size] = '\0'; 00172 00173 return d; 00174 } 00175 00176 00177 void *ws_f_strdup(WsFastMalloc *pool, const char *str) 00178 { 00179 size_t len; 00180 char *s; 00181 00182 if (str == NULL) 00183 return NULL; 00184 00185 len = strlen(str) + 1; 00186 s = ws_f_malloc(pool, len); 00187 00188 if (s == NULL) 00189 return NULL; 00190 00191 memcpy(s, str, len); 00192 00193 return s; 00194 }