Oh no, there are nomads in my allocator!
This commit is contained in:
parent
ce80c87438
commit
34f8746e27
2 changed files with 28 additions and 5 deletions
30
axl_memory.c
30
axl_memory.c
|
|
@ -15,6 +15,7 @@ typedef struct mb_header mb_header;
|
||||||
#define MB_HEADER_SIZE sizeof(mb_header)
|
#define MB_HEADER_SIZE sizeof(mb_header)
|
||||||
|
|
||||||
static mb_header* root = NULL;
|
static mb_header* root = NULL;
|
||||||
|
static mb_header* nomad = NULL;
|
||||||
|
|
||||||
void* axl_memset(void* ptr, i8 c, u32 n)
|
void* axl_memset(void* ptr, i8 c, u32 n)
|
||||||
{
|
{
|
||||||
|
|
@ -47,15 +48,29 @@ void axl_init(void)
|
||||||
|
|
||||||
mb_header* axl_find_mb(u32 req_size)
|
mb_header* axl_find_mb(u32 req_size)
|
||||||
{
|
{
|
||||||
mb_header* block = root;
|
mb_header* block = nomad ? nomad : root;
|
||||||
|
mb_header* start = block;
|
||||||
|
|
||||||
while(block != NULL)
|
while(block)
|
||||||
{
|
{
|
||||||
if(block->is_free && block->size >= req_size)
|
if(block->is_free && block->size >= req_size)
|
||||||
{
|
{
|
||||||
return block;
|
return block;
|
||||||
}
|
}
|
||||||
|
|
||||||
block = block->next;
|
block = block->next;
|
||||||
|
|
||||||
|
if(!block)
|
||||||
|
{
|
||||||
|
//nomad pointer didn't help us, start from root
|
||||||
|
block = root;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(block == start)
|
||||||
|
{
|
||||||
|
//full circle, we didn't find a free memory block
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
@ -98,6 +113,12 @@ void* axl_malloc(u32 size)
|
||||||
axl_split_mb(free_block, size);
|
axl_split_mb(free_block, size);
|
||||||
free_block->is_free = false;
|
free_block->is_free = false;
|
||||||
|
|
||||||
|
nomad = free_block->next;
|
||||||
|
if(!nomad)
|
||||||
|
{
|
||||||
|
nomad = root;
|
||||||
|
}
|
||||||
|
|
||||||
return (void*)((u8*)free_block + MB_HEADER_SIZE);
|
return (void*)((u8*)free_block + MB_HEADER_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -113,6 +134,8 @@ void axl_free(void* ptr)
|
||||||
mb_header* prev_block = block->prev;
|
mb_header* prev_block = block->prev;
|
||||||
block->is_free = true;
|
block->is_free = true;
|
||||||
|
|
||||||
|
mb_header* free_block = block;
|
||||||
|
|
||||||
if(next_block != NULL && next_block->is_free)
|
if(next_block != NULL && next_block->is_free)
|
||||||
{
|
{
|
||||||
block->size += next_block->size + MB_HEADER_SIZE;
|
block->size += next_block->size + MB_HEADER_SIZE;
|
||||||
|
|
@ -131,5 +154,8 @@ void axl_free(void* ptr)
|
||||||
{
|
{
|
||||||
prev_block->next->prev = prev_block;
|
prev_block->next->prev = prev_block;
|
||||||
}
|
}
|
||||||
|
free_block = prev_block;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nomad = free_block;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
3
main.c
3
main.c
|
|
@ -1,5 +1,4 @@
|
||||||
#include "axl.h"
|
#include "axl.h"
|
||||||
#include <windows.h>
|
|
||||||
|
|
||||||
int _start(void)
|
int _start(void)
|
||||||
{
|
{
|
||||||
|
|
@ -15,8 +14,6 @@ int _start(void)
|
||||||
(void)fds;
|
(void)fds;
|
||||||
(void)f;
|
(void)f;
|
||||||
|
|
||||||
Sleep(2);
|
|
||||||
|
|
||||||
while(true){}
|
while(true){}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue