Скрябин Иван P32092
4 unresolved threads
- Last updated by Иван Скрябин
32 32 extern inline bool region_is_invalid( const struct region* r ); 33 33 34 34 35 36 35 static void* map_pages(void const* addr, size_t length, int additional_flags) { 37 36 return mmap( (void*) addr, length, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | additional_flags , -1, 0 ); 38 37 } 39 38 40 39 /* аллоцировать регион памяти и инициализировать его блоком */ 41 static struct region alloc_region ( void const * addr, size_t query ) { 42 /* ??? */ 40 static struct region alloc_region( void* addr, size_t query ) { так мы же инициализируем его блоком, это как по мне подразумевает за собой операцию block_init, которая нарушает как раз константность.
Edited by Иван Скрябин
124 125 static struct block_search_result find_good_or_last ( struct block_header* restrict block, size_t query){ 126 if(!block) return (struct block_search_result) {BSR_CORRUPTED}; 127 128 while(try_merge_with_next(block)); 129 130 while(block->next && !is_block_good(block, query)){ 131 block = block->next; 132 while(try_merge_with_next(block)); 133 } 94 134 95 static struct block_search_result find_good_or_last ( struct block_header* restrict block, size_t sz ) { 96 /*??? */ 135 if(block->next == NULL && !is_block_good(block, query)) return (struct block_search_result){BSR_REACHED_END_NOT_FOUND, block}; 136 return (struct block_search_result){BSR_FOUND_GOOD_BLOCK, block}; 97 137 } - Last updated by Иван Скрябин
165 166 return last->next; 109 167 } 110 168 111 169 /* Реализует основную логику malloc и возвращает заголовок выделенного блока */ 112 170 static struct block_header* memalloc( size_t query, struct block_header* heap_start) { 171 query = size_max(query, BLOCK_MIN_CAPACITY); 113 172 114 /* ??? */ 115 173 struct block_search_result res = find_good_or_last(heap_start, query); 174 175 if(res.type == BSR_FOUND_GOOD_BLOCK) { 176 split_if_too_big(res.block, query); 177 res.block->is_free = false; 178 return res.block; changed this line in version 2 of the diff
- Last updated by Иван Скрябин
9 #include <sys/mman.h> 10 11 #define HEAP_SIZE (capacity_from_size((block_size) {REGION_MIN_SIZE}).bytes) 12 13 void test_success() { 14 heap_init(HEAP_SIZE); 15 void *pointer = _malloc(HEAP_SIZE / 8); 16 17 assert(pointer != NULL); 18 19 for(int i = 0; i < HEAP_SIZE / 8; i++) ((char *) pointer)[i] = '0'; 20 21 munmap(HEAP_START, size_from_capacity((block_capacity) { HEAP_SIZE }).bytes); 22 } 23 24 void test_one_free() { @malevrovich с вас фиксы
@railolog done.
@andrew принято