Data Structures | |
| struct | di_mem_chunk |
| a mem chunk More... | |
| struct | di_mem_area |
| a mem area More... | |
Functions | |
| di_mem_chunk * | di_mem_chunk_new (di_ksize_t atom_size, di_ksize_t area_size) __attribute__((nonnull)) |
| void * | di_mem_chunk_alloc (di_mem_chunk *mem_chunk) |
| void * | di_mem_chunk_alloc0 (di_mem_chunk *mem_chunk) |
| void | di_mem_chunk_destroy (di_mem_chunk *mem_chunk) |
| size_t | di_mem_chunk_size (di_mem_chunk *mem_chunk) |
| size_t | internal_di_mem_chunk_compute_size (size_t size, size_t min_size) __attribute__((nonnull)) |
|
|
Allocate a piece
00124 {
00125 void *mem;
00126
00127 if ((!mem_chunk->mem_area) || ((mem_chunk->mem_area->index + mem_chunk->atom_size) > mem_chunk->area_size))
00128 {
00129 mem_chunk->mem_area = di_malloc (mem_chunk->rarea_size);
00130
00131 mem_chunk->num_mem_areas += 1;
00132 mem_chunk->mem_area->next = mem_chunk->mem_areas;
00133 mem_chunk->mem_area->prev = NULL;
00134
00135 if (mem_chunk->mem_areas)
00136 mem_chunk->mem_areas->prev = mem_chunk->mem_area;
00137 mem_chunk->mem_areas = mem_chunk->mem_area;
00138
00139 mem_chunk->mem_area->index = 0;
00140 mem_chunk->mem_area->free = mem_chunk->area_size;
00141 mem_chunk->mem_area->allocated = 0;
00142 }
00143
00144 mem = &mem_chunk->mem_area->mem[mem_chunk->mem_area->index];
00145 mem_chunk->mem_area->index += mem_chunk->atom_size;
00146 mem_chunk->mem_area->free -= mem_chunk->atom_size;
00147 mem_chunk->mem_area->allocated += 1;
00148
00149 return mem;
00150 }
|
|
|
Allocate a cleared piece
00160 {
00161 void *mem;
00162
00163 mem = di_mem_chunk_alloc (mem_chunk);
00164
00165 if (mem)
00166 memset (mem, 0, mem_chunk->atom_size);
00167
00168 return mem;
00169 }
|
|
||||||||||||
|
Makes a new Memory-Chunk Allocer
00091 {
00092 di_mem_chunk *mem_chunk;
00093
00094 if (area_size < atom_size)
00095 return NULL;
00096
00097 area_size = (area_size + atom_size - 1) / atom_size;
00098 area_size *= atom_size;
00099
00100 mem_chunk = di_new (di_mem_chunk, 1);
00101 mem_chunk->num_mem_areas = 0;
00102 mem_chunk->num_marked_areas = 0;
00103 mem_chunk->mem_area = NULL;
00104 mem_chunk->mem_areas = NULL;
00105 mem_chunk->atom_size = atom_size;
00106
00107 if (mem_chunk->atom_size % MEM_ALIGN)
00108 mem_chunk->atom_size += MEM_ALIGN - (mem_chunk->atom_size % MEM_ALIGN);
00109
00110 mem_chunk->rarea_size = internal_di_mem_chunk_compute_size (area_size + sizeof (di_mem_area) - MEM_AREA_SIZE, atom_size + sizeof (di_mem_area) - MEM_AREA_SIZE);
00111 mem_chunk->area_size = mem_chunk->rarea_size - (sizeof (di_mem_area) - MEM_AREA_SIZE);
00112
00113 return mem_chunk;
00114 }
|
1.3.6-20040222