| 201 | } |
| 202 | |
| 203 | void* allocFromHeader(MemoryBlock* block, RegionAllocHeader* header, u32 size) |
| 204 | { |
| 205 | assert(header->free == 1); |
| 206 | if (header->size - size >= MIN_SPLIT_SIZE) |
| 207 | { |
| 208 | // Split. |
| 209 | u64 split0 = size; |
| 210 | u64 split1 = header->size - split0; |
| 211 | RegionAllocHeader* next = (RegionAllocHeader*)((u8*)header + split0); |
| 212 | |
| 213 | // Cleanup the free list. |
| 214 | removeHeaderFromFreelist(block, header); |
| 215 | header->size = u32(split0); |
| 216 | |
| 217 | // Create a new free block. |
| 218 | next->size = u32(split1); |
| 219 | next->free = 0; |
| 220 | block->count++; |
| 221 | |
| 222 | // Add the new block to the free list. |
| 223 | insertBlockIntoFreelist(block, next); |
| 224 | } |
| 225 | else |
| 226 | { |
| 227 | // Consume the whole block. |
| 228 | removeHeaderFromFreelist(block, header); |
| 229 | } |
| 230 | block->sizeFree -= header->size; |
| 231 | return (u8*)header + sizeof(RegionAllocHeader); |
| 232 | } |
| 233 | |
| 234 | void* region_alloc(MemoryRegion* region, u64 size) |
| 235 | { |
no test coverage detected