133 lines
3.2 KiB
C
133 lines
3.2 KiB
C
/**
|
||
* @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__
|