Main Page | Modules | Data Structures | File List | Data Fields | Related Pages

Memory chunk allocer
[Memory management]


Data Structures

struct  di_mem_chunk
 a mem chunk More...

struct  di_mem_area
 a mem area More...


Functions

di_mem_chunkdi_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))

Function Documentation

void* di_mem_chunk_alloc di_mem_chunk mem_chunk  ) 
 

Allocate a piece

Parameters:
mem_chunk a di_mem_chunk
Returns:
memory

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 }

void* di_mem_chunk_alloc0 di_mem_chunk mem_chunk  ) 
 

Allocate a cleared piece

Parameters:
mem_chunk a di_mem_chunk
Returns:
memory

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 }

di_mem_chunk* di_mem_chunk_new di_ksize_t  atom_size,
di_ksize_t  area_size
 

Makes a new Memory-Chunk Allocer

Parameters:
atom_size size of each piece
area_size size of each alloced chunk

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 }


Generated on Sat Jul 24 17:41:45 2004 for libdebian-installer by doxygen 1.3.7