准备实现一个内存池,最大的特点是支持分片释放。
何谓分片释放,比如一次申请了100字节,第一次释放时可以先只释放前50字节,此时app可以继续使用未释放的剩余50字节,等到最后,app可以再次调用释放接口释放剩余的50字节。
#define FREE_RET_Ok 0 #define FREE_RET_Not_In_Memory_Pool 1 #define FREE_RET_Bad_Parameter 2 #define FREE_RET_Bad_Slice_Info 3 /** * @brief 创建内存池 * @param size 内存池大小,单位为字节 * @param thread_safe 是否线程安全 * @return 内存池指针 */ memory_pool* memory_pool_create(uint32_t size, int32_t need_thread_safe); /** * @brief 销毁内存池 * @param pool 内存池指针 * @return void */ void memory_pool_destroy(memory_pool *pool); /** * @brief 内存申请 * @param pool 内存池指针 * @param size 申请内存大小,单位为字节 * @return 申请的内存指针,申请失败返回NULL */ void* memory_pool_malloc(memory_pool *pool, uint32_t size); /** * @brief 内存释放 * @param pool 内存池指针 * @param ptr 待释放的内存指针 * @return 见:FREE_RET_* */ int memory_pool_free(memory_pool *pool, void *ptr); //一次最多释放8块分片内存 #define SLICE_INFO_NUM_MAX (8) //分片释放的每片最小Size,小于这个值无法释放,因为可能无法存放元数据而无法管理 #define SLICE_SIZE_MIN (2 * sizeof(seg_item)) typedef struct slice_info { void* ptr; //分片内存的起始地址 int32_t size; //分片内存的大小,必须大于等于SLICE_SIZE_MIN } slice_info; typedef struct slice_info_array { int32_t num; //需要释放几块分片内存 slice_info slice_arr[SLICE_INFO_NUM_MAX + 1]; //每块分片内存的起始地址指针 //释放中间内存后,返回的内存被切开,因此数量+1 } slice_info_array; /** * @brief 内存分片释放 * @param pool 内存池指针 * @param ptr 待分片释放的内存头指针 * @param info 待分片释放的内存指针 * @return 见:FREE_RET_* * 释放成功后,切分的分片内存块存在参数info里返回出来。 */ int memory_pool_slice_free(memory_pool *pool, void *ptr, slice_info_array *info);