55 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C++
		
	
	
			
		
		
	
	
			55 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C++
		
	
	
| /*
 | |
| * Mr. 4th Dimention - Allen Webster
 | |
| *
 | |
| * 07.02.2019
 | |
| *
 | |
| * Memory bank wrapper for heap
 | |
| *
 | |
| */
 | |
| 
 | |
| // TOP
 | |
| 
 | |
| internal void
 | |
| memory_bank_init(Memory_Bank *mem_bank){
 | |
|     heap_init(&mem_bank->heap);
 | |
|     mem_bank->first = 0;
 | |
|     mem_bank->last = 0;
 | |
|     mem_bank->total_memory_size = 0;
 | |
| }
 | |
| 
 | |
| internal void*
 | |
| memory_bank_allocate(Heap *heap, Memory_Bank *mem_bank, i32 size){
 | |
|     void *ptr = heap_allocate(&mem_bank->heap, size);
 | |
|     if (ptr == 0){
 | |
|         i32 alloc_size = clamp_bottom(4096, size*4 + sizeof(Memory_Header));
 | |
|         void *new_block = heap_allocate(heap, alloc_size);
 | |
|         if (new_block != 0){
 | |
|             Memory_Header *header = (Memory_Header*)new_block;
 | |
|             sll_push(mem_bank->first, mem_bank->last, header);
 | |
|             mem_bank->total_memory_size += alloc_size;
 | |
|             heap_extend(&mem_bank->heap, header + 1, alloc_size - sizeof(*header));
 | |
|             ptr = heap_allocate(&mem_bank->heap, size);
 | |
|         }
 | |
|     }
 | |
|     return(ptr);
 | |
| }
 | |
| 
 | |
| internal void
 | |
| memory_bank_free(Memory_Bank *mem_bank, void *ptr){
 | |
|     heap_free(&mem_bank->heap, ptr);
 | |
| }
 | |
| 
 | |
| internal void
 | |
| memory_bank_free_all(Heap *heap, Memory_Bank *mem_bank){
 | |
|     for (Memory_Header *header = mem_bank->first, *next = 0;
 | |
|          header != 0;
 | |
|          header = next){
 | |
|         next = header->next;
 | |
|         heap_free(heap, header);
 | |
|     }
 | |
|     mem_bank->total_memory_size = 0;
 | |
| }
 | |
| 
 | |
| // BOTTOM
 | |
| 
 |