libdebian-installer
Data Structures | Functions
Di_mem_chunk

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

Detailed Description

Function Documentation

◆ di_mem_chunk_alloc()

void * di_mem_chunk_alloc ( di_mem_chunk mem_chunk)

Allocate a piece

Parameters
mem_chunka di_mem_chunk
Returns
memory
121{
122 void *mem;
123
124 if ((!mem_chunk->mem_area) || ((mem_chunk->mem_area->index + mem_chunk->atom_size) > mem_chunk->area_size))
125 {
126 mem_chunk->mem_area = di_malloc (mem_chunk->rarea_size);
127
128 mem_chunk->num_mem_areas += 1;
129 mem_chunk->mem_area->next = mem_chunk->mem_areas;
130 mem_chunk->mem_area->prev = NULL;
131
132 if (mem_chunk->mem_areas)
133 mem_chunk->mem_areas->prev = mem_chunk->mem_area;
134 mem_chunk->mem_areas = mem_chunk->mem_area;
135
136 mem_chunk->mem_area->index = 0;
137 mem_chunk->mem_area->free = mem_chunk->area_size;
138 mem_chunk->mem_area->allocated = 0;
139 }
140
141 mem = &mem_chunk->mem_area->mem[mem_chunk->mem_area->index];
142 mem_chunk->mem_area->index += mem_chunk->atom_size;
143 mem_chunk->mem_area->free -= mem_chunk->atom_size;
144 mem_chunk->mem_area->allocated += 1;
145
146 return mem;
147}
void * di_malloc(size_t n_bytes) __attribute__((malloc))
Definition: mem.c:29
di_mem_area * next
Definition: mem_chunk.c:63
di_mem_area * prev
Definition: mem_chunk.c:64
size_t free
Definition: mem_chunk.c:66
size_t index
Definition: mem_chunk.c:65
char mem[MEM_AREA_SIZE]
Definition: mem_chunk.c:68
size_t allocated
Definition: mem_chunk.c:67
di_mem_area * mem_area
Definition: mem_chunk.c:53
size_t area_size
Definition: mem_chunk.c:51
size_t atom_size
Definition: mem_chunk.c:50
di_mem_area * mem_areas
Definition: mem_chunk.c:54
int num_mem_areas
Definition: mem_chunk.c:48
size_t rarea_size
Definition: mem_chunk.c:52

References di_mem_area::allocated, area_size, atom_size, di_malloc(), di_mem_area::free, di_mem_area::index, di_mem_area::mem, mem_area, mem_areas, di_mem_area::next, num_mem_areas, di_mem_area::prev, and rarea_size.

Referenced by di_mem_chunk_alloc0().

◆ di_mem_chunk_alloc0()

void * di_mem_chunk_alloc0 ( di_mem_chunk mem_chunk)

Allocate a cleared piece

Parameters
mem_chunka di_mem_chunk
Returns
memory
157{
158 void *mem;
159
160 mem = di_mem_chunk_alloc (mem_chunk);
161
162 if (mem)
163 memset (mem, 0, mem_chunk->atom_size);
164
165 return mem;
166}
void * di_mem_chunk_alloc(di_mem_chunk *mem_chunk)
Definition: mem_chunk.c:120

References atom_size, and di_mem_chunk_alloc().

◆ di_mem_chunk_destroy()

void di_mem_chunk_destroy ( di_mem_chunk mem_chunk)
169{
170 di_mem_area *mem_areas, *temp_area;
171
172 mem_areas = mem_chunk->mem_areas;
173 while (mem_areas)
174 {
175 temp_area = mem_areas;
176 mem_areas = mem_areas->next;
177 di_free (temp_area);
178 }
179
180 di_free (mem_chunk);
181}
void di_free(void *mem)
Definition: mem.c:60
a mem area
Definition: mem_chunk.c:62

◆ di_mem_chunk_new()

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_sizesize of each piece
area_sizesize of each alloced chunk
88{
89 di_mem_chunk *mem_chunk;
90
91 if (area_size < atom_size)
92 return NULL;
93
94 area_size = (area_size + atom_size - 1) / atom_size;
95 area_size *= atom_size;
96
97 mem_chunk = di_new (di_mem_chunk, 1);
98 mem_chunk->num_mem_areas = 0;
99 mem_chunk->num_marked_areas = 0;
100 mem_chunk->mem_area = NULL;
101 mem_chunk->mem_areas = NULL;
102 mem_chunk->atom_size = atom_size;
103
104 if (mem_chunk->atom_size % MEM_ALIGN)
105 mem_chunk->atom_size += MEM_ALIGN - (mem_chunk->atom_size % MEM_ALIGN);
106
107 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);
108 mem_chunk->area_size = mem_chunk->rarea_size - (sizeof (di_mem_area) - MEM_AREA_SIZE);
109
110 return mem_chunk;
111}
#define di_new(struct_type, n_structs)
Definition: mem.h:73
a mem chunk
Definition: mem_chunk.c:47
int num_marked_areas
Definition: mem_chunk.c:49

References atom_size, di_new, mem_area, mem_areas, num_marked_areas, num_mem_areas, and rarea_size.

Referenced by di_hash_table_new_full(), di_packages_allocator_alloc(), and internal_di_packages_allocator_alloc().

◆ di_mem_chunk_size()

size_t di_mem_chunk_size ( di_mem_chunk mem_chunk)
184{
185 di_mem_area *mem_area;
186 size_t size = 0;
187
188 for (mem_area = mem_chunk->mem_areas; mem_area; mem_area = mem_area->next)
189 {
190 size += mem_chunk->atom_size * mem_area->allocated;
191 }
192
193 return size;
194}

◆ internal_di_mem_chunk_compute_size()

static size_t internal_di_mem_chunk_compute_size ( size_t  size,
size_t  min_size 
)
static
197{
198 size_t power_of_2;
199 size_t lower, upper;
200
201 power_of_2 = 16;
202 while (power_of_2 < size)
203 power_of_2 <<= 1;
204
205 lower = power_of_2 >> 1;
206 upper = power_of_2;
207
208 if (size - lower < upper - size && lower >= min_size)
209 return lower;
210 else
211 return upper;
212}