kernel-dev/include/kernel/memm/allocator/raw.h

70 lines
2.0 KiB
C
Raw Normal View History

2023-12-13 02:24:25 +08:00
#ifndef RAW_H
#define RAW_H 1
#include <types.h>
#include <kernel/memm.h>
2023-12-13 02:24:25 +08:00
#define MEMM_RAW_ALLOCATOR 1
typedef struct __raw_allocator_cell
{
usize capacity; // 是content的长度
usize length; // 是实际使用的长度
allocator_t *allocator; // 所在的分配器
usize reserved;
2023-12-13 02:24:25 +08:00
u8 content[0];
} raw_allocator_cell;
#define raw_allocator_next_cell(cell) (raw_allocator_cell *)((void *)((cell)->content) + (cell)->capacity)
2023-12-13 02:24:25 +08:00
// 原始分配器
//
// 包括至少一个cell分配时像cell的分裂一样将空白的一段分成两段
// 释放时只把length归零并不将cell合并。
2023-12-13 02:24:25 +08:00
// length=0的cell称为空cell
//
// 统计从上次细胞合并以来free的调用次数当调用次数很多或可用空间不足时
// 触发细胞合并。
/**
* @name raw_allocator_t
*
* cellcell的分裂一样将空白的一段分成两段length归零cell合并
*
* `length`0cell称为空cell
*
* free的调用次数`RAW_ALLOCATOR_FREE_MAX`
*
* @internal free_count
*
* free方法的调用次数`RAW_ALLOCATOR_FREE_MAX`
*/
2023-12-13 02:24:25 +08:00
typedef struct __raw_allocator_t
{
usize size;
usize free_count; // free调用计数
#define RAW_ALLOCATOR_FREE_MAX 64
usize rest_memory;
2023-12-13 02:24:25 +08:00
raw_allocator_cell cells[0];
} raw_allocator_t;
#define raw_allocator_end(allocator) ((void *)(allocator) + (allocator)->size)
2023-12-13 02:24:25 +08:00
/**
* @name raw_allocator_new
*
* ```c
* void raw_allocator_new(raw_allocator_t *allocator, usize size);
* ```
*
* `raw_allocator`
*/
2023-12-13 02:24:25 +08:00
void raw_allocator_new(raw_allocator_t *allocator, usize size);
/**
* @name raw_allocator_allocate, raw_allocator_free
*
* `raw_allocator`allocate, free方法
*/
void *raw_allocator_allocate(raw_allocator_t *allocator, usize size);
2023-12-13 02:24:25 +08:00
void raw_allocator_free(raw_allocator_t *allocator, void *mem);
#endif