00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00025 #include "memorypool.h"
00026
00027
00028 #if defined(MAP_ANON) && !defined(MAP_ANONYMOUS)
00029 #define MAP_ANONYMOUS MAP_ANON
00030 #endif
00031 #ifndef MAP_FAILED
00032 #define MAP_FAILED ((void*)-1)
00033 #endif
00034
00035
00036 struct MemoryPool
00037 {
00038
00042 char *memory;
00043
00047 unsigned int size;
00048
00052 unsigned int pos;
00053
00057 unsigned int end;
00058
00062 int is_mmap;
00063 };
00064
00070 struct MemoryPool *
00071 MHD_pool_create (unsigned int max)
00072 {
00073 struct MemoryPool *pool;
00074
00075 pool = malloc (sizeof (struct MemoryPool));
00076 if (pool == NULL)
00077 return NULL;
00078 #ifdef MAP_ANONYMOUS
00079 pool->memory = MMAP (NULL, max, PROT_READ | PROT_WRITE,
00080 MAP_ANONYMOUS, -1, 0);
00081 #else
00082 pool->memory = MAP_FAILED;
00083 #endif
00084 if ((pool->memory == MAP_FAILED) || (pool->memory == NULL))
00085 {
00086 pool->memory = malloc (max);
00087 if (pool->memory == NULL)
00088 {
00089 free (pool);
00090 return NULL;
00091 }
00092 pool->is_mmap = MHD_NO;
00093 }
00094 else
00095 {
00096 pool->is_mmap = MHD_YES;
00097 }
00098 pool->pos = 0;
00099 pool->end = max;
00100 pool->size = max;
00101 return pool;
00102 }
00103
00107 void
00108 MHD_pool_destroy (struct MemoryPool *pool)
00109 {
00110 if (pool == NULL)
00111 return;
00112 if (pool->is_mmap == MHD_NO)
00113 free (pool->memory);
00114 else
00115 MUNMAP (pool->memory, pool->size);
00116 free (pool);
00117 }
00118
00124 void *
00125 MHD_pool_allocate (struct MemoryPool *pool, unsigned int size, int from_end)
00126 {
00127 void *ret;
00128
00129 if ((pool->pos + size > pool->end) || (pool->pos + size < pool->pos))
00130 return NULL;
00131 if (from_end == MHD_YES)
00132 {
00133 ret = &pool->memory[pool->end - size];
00134 pool->end -= size;
00135 }
00136 else
00137 {
00138 ret = &pool->memory[pool->pos];
00139 pool->pos += size;
00140 }
00141 return ret;
00142 }
00143
00160 void *
00161 MHD_pool_reallocate (struct MemoryPool *pool,
00162 void *old, unsigned int old_size, unsigned int new_size)
00163 {
00164 void *ret;
00165
00166 if ((pool->end < old_size) || (pool->end < new_size))
00167 return NULL;
00168
00169 if ((pool->pos >= old_size) && (&pool->memory[pool->pos - old_size] == old))
00170 {
00171
00172 if (pool->pos + new_size - old_size <= pool->end)
00173 {
00174
00175 pool->pos += new_size - old_size;
00176 if (new_size < old_size)
00177 memset (&pool->memory[pool->pos], 0, old_size - new_size);
00178 return old;
00179 }
00180
00181 return NULL;
00182 }
00183 if (new_size <= old_size)
00184 return old;
00185 if ((pool->pos + new_size >= pool->pos) &&
00186 (pool->pos + new_size <= pool->end))
00187 {
00188
00189 ret = &pool->memory[pool->pos];
00190 memcpy (ret, old, old_size);
00191 pool->pos += new_size;
00192 return ret;
00193 }
00194
00195 return NULL;
00196 }
00197
00206 void *
00207 MHD_pool_reset (struct MemoryPool *pool, void *keep, unsigned int size)
00208 {
00209 if (keep != NULL)
00210 {
00211 if (keep != pool->memory)
00212 {
00213 memmove (pool->memory, keep, size);
00214 keep = pool->memory;
00215 }
00216 pool->pos = size;
00217 }
00218 pool->end = pool->size;
00219 return keep;
00220 }
00221
00222
00223
00224