Силинцев Владислав Витальевич P3214
4 unresolved threads
- Last updated by Силинцев Владислав
25 extern inline block_capacity capacity_from_size(block_size sz); 26 27 28 /*проверяет, может ли блок вместить указанное количество байт 29 получает размер для проверки, указатель на блок 30 возвращает true, если блок может вместить указанное количество байт*/ 31 static bool block_is_big_enough(size_t query, struct block_header* block) { 32 return block->capacity.bytes >= query; 33 } 34 35 36 /*определяет количество страниц памяти для хранения указанного количества байт 37 получает количество байт 38 возвращает количество страниц памяти*/ 39 static size_t pages_count(size_t mem) { 40 return mem / getpagesize() + ((mem % getpagesize()) > 0); 169 return block-> is_free && query + offsetof( struct block_header, contents ) + BLOCK_MIN_CAPACITY <= block->capacity.bytes; 170 } 171 172 173 /*разделяет блоки, если его размер слишком большой 174 получает указатель на блок, количество байт для проверки 175 возвращает true, если блок был разделен*/ 176 static bool split_if_too_big( struct block_header* block, size_t query ) { 177 if (block_splittable(block, query)) { 178 size_t old_block_capacity_bytes = size_max(query, BLOCK_MIN_CAPACITY); 179 block_capacity old_block_capacity = {.bytes = old_block_capacity_bytes}; 180 struct block_header* next_block = block->next; 181 182 size_t new_block_size_bytes = block->capacity.bytes - old_block_capacity_bytes; 183 block_size new_block_size = {.bytes = new_block_size_bytes}; 184 if (new_block_size.bytes < offsetof(struct block_header, contents) + BLOCK_MIN_CAPACITY) { - Last updated by Силинцев Владислав
379 возвращает указатель на начало блока*/ 380 static struct block_header* block_get_header(void* contents) { 381 return (struct block_header*) (((uint8_t*)contents)-offsetof(struct block_header, contents)); 382 } 383 384 385 /*освобождает динамическую память 386 получает указатель на массив с данными*/ 387 void _free( void* mem ) { 388 if (!mem) return ; 389 struct block_header* header = block_get_header( mem ); 390 header->is_free = true; 391 while (blocks_continuous(header, header->next)) { 392 bool result = try_merge_with_next(header); 393 if (!result) return; 394 } changed this line in version 3 of the diff
больше нечего предложить @andrew
18 static const struct region REGION_INVALID = {0}; //пустой регион 19 20 21 /*проверяет валидность региона 22 получает указатель на регион 23 возвращает true, если регион некорректен*/ 24 inline bool region_is_invalid( const struct region* r ) { return r->addr == NULL; } 25 26 27 typedef struct { size_t bytes; } block_capacity; //вместимость блока в байтах 28 29 typedef struct { size_t bytes; } block_size; //размер блока в байтах (вместимость + размер заголовка) 30 31 32 //структура для работы с блоками данных 33 struct __attribute__((packed)) block_header { Цитата из README.md
Как начало блока, так и его содержимое, должны всегда начинаться с адреса, выравненного по 16 байтам. Для выравнивания содержимого блока следует использовать спецификатор
_Alignas()
:#define BLOCK_ALIGN 16 struct block_header { // ... _Alignas(BLOCK_ALIGN) uint8_t contents[]; // aligned flexible array member };
Потом стоит поменять и BLOCK_MIN_CAPACITY на 32, чтобы проходили тесты