100 lines
2.1 KiB
C
100 lines
2.1 KiB
C
#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++;
|
|
}
|
|
}
|