#include "../include/memorymanager.h" #include "../include/system.h" #include "../include/scrn.h" static struct MemoryChunk* First; struct MemoryManager* ActiveMemoryManager = {0}; void MemoryManager(size_t start, size_t size) { if(size < sizeof(struct MemoryChunk)) { First = 0; puts("First memory block is null\n"); return; } First = (struct MemoryChunk*) start; First->Allocated = false; First->Prev = 0; First->Next = 0; First->Size = size - sizeof(struct MemoryChunk); puts("First block size "); puts(int_to_string(First->Size, 10)); puts(" bytes.\n"); } void* Malloc(size_t size) { struct MemoryChunk *freeChunk = 0; for(struct MemoryChunk* chunk = First; chunk != 0 && freeChunk == 0; chunk = chunk->Next) { if(chunk->Size > size && !chunk->Allocated) { freeChunk = chunk; } } if(freeChunk == 0) return 0; if(freeChunk->Size >= size + sizeof(struct MemoryChunk)) { struct MemoryChunk* temp = (struct MemoryChunk*)((size_t)freeChunk + sizeof(struct MemoryChunk) + size); temp->Allocated = false; temp->Size = freeChunk->Size - size - sizeof(struct MemoryChunk); temp->Prev = freeChunk; temp->Next = freeChunk->Next; if(temp->Next != 0) temp->Next->Prev = temp; freeChunk->Size = size; freeChunk->Next = temp; } freeChunk->Allocated = true; puts("Address of new chunk: 0x"); puts(int_to_string((size_t)freeChunk + sizeof(struct MemoryChunk), 16)); puts("\n"); return (void*)(((size_t) freeChunk) + sizeof(struct MemoryChunk)); } void Free(void* ptr) { struct MemoryChunk* chunk = (struct MemoryChunk*)((size_t) ptr - sizeof(struct MemoryChunk)); chunk->Allocated = false; if(chunk->Prev != 0 && !chunk->Prev->Allocated) { chunk->Prev->Next = chunk->Next; } } void ListBlocks() { struct MemoryChunk *freeChunk = 0; int count = 0; for(struct MemoryChunk* chunk = First; chunk != 0 && freeChunk == 0; chunk = chunk->Next) { puts("\nChunk "); puts(int_to_string(count, 10)); puts(" is "); puts(int_to_string(chunk->Size, 10)); puts(" bytes. Allocated? "); if(chunk->Allocated) puts("True"); else puts("False"); count++; } }