Safonova Olga P3207
7 unresolved threads
86 86 length += size_from_capacity(current_block->capacity).bytes; 87 87 if (!current_block || !current_block->next || current_block->next != block_after(current_block)) 88 88 { 89 length -= size_from_capacity(current_block->capacity).bytes; 89 90 munmap(remember_block, length); 90 91 remember_block = current_block; 91 length = 0; 92 length = size_from_capacity(current_block->capacity).bytes; @olga Смотрите, у вас сначала remember_block = current_block; потом munmap(remember_block, length); размапливается память, потом считаем
size_from_capacity(current_block->capacity)
и так как remember_block = current_block; получается обращение к уже размапленой памяти и сегфолтEdited by Даниил Садырин
86 86 length += size_from_capacity(current_block->capacity).bytes; 87 87 if (!current_block || !current_block->next || current_block->next != block_after(current_block)) @olga Можно взять этот коммит, и добавить чтобы в начале цикла считать
next_block
иsize_
(через size_from_capacity). Чтобы избежать обращений к размапленой памяти, и заработаетEdited by Даниил Садырин
- Last updated by olga safonova
43 void *real_addr = map_pages(addr, real_size, MAP_FIXED_NOREPLACE); 44 45 struct region allocated_region = {}; 46 47 allocated_region.extends = true; 48 49 if(real_addr == MAP_FAILED) 50 { 51 real_addr = map_pages(addr, real_size, 0); 52 53 if(real_addr == MAP_FAILED) 54 { 55 return (struct region) {}; 56 } 57 58 allocated_region.extends = false; changed this line in version 2 of the diff
- Last updated by olga safonova
53 77 54 78 /* освободить всю память, выделенную под кучу */ 55 79 void heap_term( ) { 56 /* ??? */ 80 struct block_header* current_block = (struct block_header*) HEAP_START; 81 struct block_header* remember_block = current_block; 82 struct block_header* next_block = current_block; 83 size_t length = 0; 84 85 if(!next_block && current_block) changed this line in version 2 of the diff
- Last updated by olga safonova
84 85 if(!next_block && current_block) 86 { 87 length += size_from_capacity(current_block->capacity).bytes; 88 munmap(remember_block, length); 89 return; 90 } 91 92 while(next_block) 93 { 94 current_block = next_block; 95 next_block = current_block->next; 96 97 length += size_from_capacity(current_block->capacity).bytes; 98 99 if (!current_block || !next_block || next_block != block_after(current_block)) - Last updated by olga safonova
117 if (block_splittable(block, query)) 118 { 119 block_capacity capacity = { .bytes = (query > BLOCK_MIN_CAPACITY ? query : BLOCK_MIN_CAPACITY) }; 120 121 block_size first_size = { size_from_capacity(capacity).bytes }; 122 block_size second_size = { (block->capacity.bytes - capacity.bytes) }; 123 124 void *first_block_addr = block; 125 void *second_block_addr = block->contents + capacity.bytes; 126 void *last_block_chain = block->next; 127 128 block_init(first_block_addr, first_size, second_block_addr); 129 block_init(second_block_addr, second_size, last_block_chain); 130 131 return true; 132 } else return false; changed this line in version 3 of the diff
- Last updated by olga safonova
85 149 } 86 150 87 151 static bool try_merge_with_next( struct block_header* block ) { 88 /* ??? */ 152 if(block && block->next && mergeable(block, block->next)) 153 { 154 block->capacity.bytes += size_from_capacity(block->next->capacity).bytes; 155 block->next = block->next->next; 156 return true; 157 } else return false; 89 158 } линтер падает на этом https://gitlab.se.ifmo.ru/olga/assignment-4-memory-allocator/-/pipelines/71048
- Last updated by olga safonova
205 if(last) 206 { 207 struct region new_region = alloc_region(block_after(last), query); 208 209 if(region_is_invalid(&new_region)) 210 return NULL; 211 212 last->next = new_region.addr; 213 214 if(try_merge_with_next(last)) 215 { 216 return last; 217 } 218 219 return new_region.addr; 220 } else return NULL; changed this line in version 3 of the diff
116 223 /* Реализует основную логику malloc и возвращает заголовок выделенного блока */ 117 224 static struct block_header* memalloc( size_t query, struct block_header* heap_start) { 225 struct block_search_result result = try_memalloc_existing(query, heap_start); 118 226 119 /* ??? */ 120 227 if(result.type == BSR_FOUND_GOOD_BLOCK) 228 { 229 return result.block; 230 } 231 else if(result.type == BSR_REACHED_END_NOT_FOUND) 232 { 233 struct block_header *new_block = grow_heap(result.block, query); 234 result = try_memalloc_existing(query, new_block); 235 } 236 return result.block; @dsadyrin всё ок