smcc/lib/rt/rt_alloc.h
ZZY 8d97fe896c chore: 更新 .gitignore 文件
- 添加 docs 文件夹到忽略列表,以忽略 Doxygen 生成的文件
- 保持原有的忽略规则不变
2025-04-05 23:11:39 +08:00

133 lines
3.2 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* @file rt_alloc.h
* @brief 内存分配器接口
*
* 提供三种内存分配器实现:简单分配器、固定大小分配器和长块分配器
*/
#ifndef __SMCC_RT_ALLOC_H__
#define __SMCC_RT_ALLOC_H__
#include "std/rt_api_def.h"
/** @defgroup simple_allocator 简单分配器 */
/**
* @brief 分配指定大小的内存块
* @param size 请求分配的内存大小(字节)
* @return 成功返回内存指针失败返回NULL
*/
void* salloc_alloc(int size);
/**
* @brief 重新分配内存块
* @param ptr 原内存指针
* @param size 新内存大小(字节)
* @return 成功返回新内存指针失败返回NULL
*/
void* salloc_realloc(void* ptr, int size);
/**
* @brief 释放内存块
* @param ptr 要释放的内存指针
*/
void salloc_free(void* ptr);
/** @defgroup fixed_allocator 固定大小分配器 */
/**
* @struct fixed_alloc_t
* @brief 固定大小内存分配器上下文
*/
typedef struct fixed_alloc {
/** @brief 内存页链表头指针 */
void* page_list;
/** @brief 空闲块链表头指针 */
void* free_list;
/** @brief 每个内存块的固定大小 */
int block_size;
/** @brief 每页包含的块数量 */
int blocks_per_page;
} fixed_alloc_t;
/**
* @brief 初始化固定大小分配器
* @param fa 分配器上下文指针
* @param fixed_size 每个内存块的固定大小
* @param init_size 初始预分配块数量
*/
void falloc_init(fixed_alloc_t* fa, int fixed_size, int init_size);
/**
* @brief 分配固定大小内存块
* @param fa 分配器上下文指针
* @return 成功返回内存指针失败返回NULL
*/
void* falloc_alloc(fixed_alloc_t* fa);
/**
* @brief 释放内存块
* @param fa 分配器上下文指针
* @param ptr 要释放的内存指针
*/
void falloc_free(fixed_alloc_t* fa, void* ptr);
/**
* @brief 销毁分配器并释放所有内存页
* @param fa 分配器上下文指针
*/
void falloc_destroy(fixed_alloc_t* fa);
/** @defgroup long_allocator 长块分配器 */
/**
* @struct long_block_t
* @brief 长块内存块头结构
*/
typedef struct long_block {
/** @brief 指向下一个内存块的指针 */
struct long_block* next;
/** @brief 当前块使用状态标志 */
int used;
} long_block_t;
/**
* @struct long_alloc_t
* @brief 长块分配器上下文
*/
typedef struct long_alloc {
/** @brief 当前内存块指针 */
long_block_t* current;
/** @brief 内存块的标准大小 */
int block_size;
} long_alloc_t;
/**
* @brief 初始化长块分配器
* @param la 分配器上下文指针
*/
void lalloc_init(long_alloc_t* la);
/**
* @brief 分配指定大小的内存块
* @param la 分配器上下文指针
* @param size 请求分配的内存大小
* @return 成功返回内存指针失败返回NULL
*/
void* lalloc_alloc(long_alloc_t* la, int size);
/**
* @brief 标记释放内存块(实际在块耗尽时统一释放)
* @param la 分配器上下文指针
* @param ptr 要释放的内存指针
*/
void lalloc_free(long_alloc_t* la, void* ptr);
/**
* @brief 销毁分配器并释放所有内存块
* @param la 分配器上下文指针
*/
void lalloc_destroy(long_alloc_t* la);
#endif // __SMCC_RT_ALLOC_H__