54 lines
1.5 KiB
C
54 lines
1.5 KiB
C
#ifndef _LIBC_STDLIB__MEM_
|
|
#define _LIBC_STDLIB__MEM_
|
|
|
|
#include <stddef.h>
|
|
|
|
struct mem_node {
|
|
// сколько свободно
|
|
size_t free;
|
|
|
|
// Размер блока
|
|
size_t size;
|
|
|
|
struct mem_node* last;
|
|
struct mem_node* next;
|
|
|
|
// реально выделена под него память
|
|
// если нет, то он получается был втиснут в другой блок
|
|
// bool is_real;
|
|
};
|
|
|
|
// блок выделенной памяти
|
|
struct mem_block {
|
|
size_t size; // сколько было полученно памяти
|
|
};
|
|
|
|
// получить указатель на данные ноды
|
|
#define GET_MEM_NODE_PTR(node) (char*)((char*)(node) + sizeof(struct mem_node))
|
|
|
|
// Является ли блок сейчас пустым
|
|
#define MEM_NODE_IS_FREE(node) (node->free == node->size)
|
|
|
|
#define GET_mem_node_USED_MEM(node) (node->size - node->free)
|
|
|
|
#define GET_mem_node_HEADER(ptr) ((struct mem_node*)((char*)ptr - sizeof(struct mem_node)))
|
|
|
|
// проверить находятся ли ноды в одном блоке.
|
|
// Если они в одном блоке, но получаестя они должны идти друг за другом
|
|
#define mem_nodeS_ARE_IN_ONE_BLOCK(left, right) (GET_MEM_NODE_PTR(left) + left->size == (char*)right)
|
|
|
|
|
|
// Размер блока
|
|
#define ALLOC_BLOCK_SIZE 4096
|
|
|
|
inline size_t __mem_align(size_t value, size_t v)
|
|
{
|
|
size_t ret = (value + v - 1) & ~(v - 1);
|
|
|
|
return ret;
|
|
}
|
|
|
|
static struct mem_node* __mem_node = NULL;
|
|
|
|
#endif // _LIBC_STDLIB_MEM_
|