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

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_list_append(), di_list_prepend(), di_mem_chunk_alloc0(), di_slist_append(), and di_slist_prepend().

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 }
di_mem_area * next
Definition: mem_chunk.c:63
di_mem_area * mem_areas
Definition: mem_chunk.c:54
di_mem_area * prev
Definition: mem_chunk.c:64
size_t rarea_size
Definition: mem_chunk.c:52
size_t index
Definition: mem_chunk.c:65
void * di_malloc(size_t n_bytes) __attribute__((malloc))
Definition: mem.c:29
char mem[MEM_AREA_SIZE]
Definition: mem_chunk.c:68
size_t free
Definition: mem_chunk.c:66
size_t atom_size
Definition: mem_chunk.c:50
di_mem_area * mem_area
Definition: mem_chunk.c:53
int num_mem_areas
Definition: mem_chunk.c:48
size_t allocated
Definition: mem_chunk.c:67
size_t area_size
Definition: mem_chunk.c:51

◆ 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

References atom_size, and di_mem_chunk_alloc().

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
size_t atom_size
Definition: mem_chunk.c:50

◆ 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

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

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 }
di_mem_area * mem_areas
Definition: mem_chunk.c:54
a mem chunk
Definition: mem_chunk.c:46
size_t rarea_size
Definition: mem_chunk.c:52
int num_marked_areas
Definition: mem_chunk.c:49
a mem area
Definition: mem_chunk.c:61
size_t atom_size
Definition: mem_chunk.c:50
#define di_new(struct_type, n_structs)
Definition: mem.h:73
di_mem_area * mem_area
Definition: mem_chunk.c:53
int num_mem_areas
Definition: mem_chunk.c:48
size_t area_size
Definition: mem_chunk.c:51