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)
static 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 Sep 29 08:45:16 2007 for libdebian-installer by  doxygen 1.5.1