acl/lib_acl/include/stdlib/acl_allocator.h
2021-06-18 19:05:48 +08:00

196 lines
6.1 KiB
C

#ifndef ACL_ALLOCATOR_INCLUDE_H
#define ACL_ALLOCATOR_INCLUDE_H
#ifdef __cplusplus
extern "C" {
#endif
#ifndef ACL_PREPARE_COMPILE
#include "acl_define.h"
#include <stdlib.h>
#endif
typedef enum {
ACL_MEM_TYPE_NONE,
ACL_MEM_TYPE_8_BUF,
ACL_MEM_TYPE_16_BUF,
ACL_MEM_TYPE_32_BUF,
ACL_MEM_TYPE_64_BUF,
ACL_MEM_TYPE_128_BUF,
ACL_MEM_TYPE_256_BUF,
ACL_MEM_TYPE_512_BUF,
ACL_MEM_TYPE_1K_BUF,
ACL_MEM_TYPE_2K_BUF,
ACL_MEM_TYPE_4K_BUF,
ACL_MEM_TYPE_8K_BUF,
ACL_MEM_TYPE_16K_BUF,
ACL_MEM_TYPE_32K_BUF,
ACL_MEM_TYPE_64K_BUF,
ACL_MEM_TYPE_128K_BUF,
ACL_MEM_TYPE_256K_BUF,
ACL_MEM_TYPE_512K_BUF,
ACL_MEM_TYPE_1M_BUF,
ACL_MEM_TYPE_VSTRING,
ACL_MEM_TYPE_MAX
} acl_mem_type;
typedef struct ACL_MEM_POOL ACL_MEM_POOL;
typedef struct ACL_ALLOCATOR ACL_ALLOCATOR;
/* in acl_mpool.c */
/**
* 创建一个内存分配池对象
* @param mem_limit {size_t} 内存池的最大内存,单位为字节
* @return {ACL_ALLOCATOR *} 内存分配池对象指针
*/
ACL_API ACL_ALLOCATOR *acl_allocator_create(size_t mem_limit);
/**
* 控制内存分配池的一些参数
* @param name {int} 参数列表的第一个参数
* 调用方式如下:
* acl_allocator_ctl(ACL_ALLOCATOR_CTL_MIN_SIZE, 128,
* ACL_ALLOCATOR_CTL_MAX_SIZE, 1024,
* ACL_ALLOCATOR_CTL_END);
*/
ACL_API void acl_allocator_ctl(int name, ...);
#define ACL_ALLOCATOR_CTL_END 0 /**< 结束标记 */
#define ACL_ALLOCATOR_CTL_MIN_SIZE 1 /**< 设置最小字节数 */
#define ACL_ALLOCATOR_CTL_MAX_SIZE 2 /**< 设置最大字节数 */
/**
* 配置内存分配池的容量大小
* @param allocator {ACL_ALLOCATOR*}
* @param mem_limit {size_t} 内存池的最大值,单位为字节
*/
ACL_API void acl_allocator_config(ACL_ALLOCATOR *allocator, size_t mem_limit);
/**
* 释放内存分配池对象及其所管理的内存
* @param allocator {ACL_ALLOCATOR*}
*/
ACL_API void acl_allocator_free(ACL_ALLOCATOR *allocator);
/**
* 添加一个新的内存分配类型
* @param allocator {ACL_ALLOCATOR*}
* @param label {const char*} 该内存分配类型的描述信息
* @param obj_size {size_t} 每个该内存类型的大小,单位为字节
* @param type {acl_mem_type} 内存类型
* @param after_alloc_fn {void (*)(void*, void*)} 分配内存成功后调用的函数,可以为空
* @param before_free_fn {void (*)(void*, void*)} 释放内存前回调的函数,可以为空
* @param pool_ctx {void*} 应用自己的私有对象,如果 after_alloc_fn 或 before_free_fn
* 不为空,则回调时将此参数直接传递给应用
* @return {ACL_MEM_POOL*} 该内存分配类型所对应的对象
*/
ACL_API ACL_MEM_POOL *acl_allocator_pool_add(ACL_ALLOCATOR *allocator,
const char *label,
size_t obj_size,
acl_mem_type type,
void (*after_alloc_fn)(void *obj, void *pool_ctx),
void (*before_free_fn)(void *obj, void *pool_ctx),
void *pool_ctx);
/**
* 从内存分配池中移除某种内存分配类型
* @param allocator {ACL_ALLOCATOR*}
* @param pool {ACL_MEM_POOL*} 由 acl_allocatore_pool_add 返回的对象
*/
ACL_API void acl_allocator_pool_remove(ACL_ALLOCATOR *allocator, ACL_MEM_POOL *pool);
/**
* 探测某种分配类型是否存在于内存分配池的内存分配类型中
* @param allocator {ACL_ALLOCATOR*}
* @param type {acl_mem_type} 内存类型
* @return {int}, 0: 否,!= 0: 是
*/
ACL_API int acl_allocator_pool_ifused(ACL_ALLOCATOR *allocator, acl_mem_type type);
/**
* 某种分配类型的内存对象当前被使用的个数
* @param allocator {ACL_ALLOCATOR*}
* @param type {acl_mem_type} 内存类型
* @return {int} 当前正在被使用的某种内存分配类型的内存对象个数
*/
ACL_API int acl_allocator_pool_inuse_count(ACL_ALLOCATOR *allocator, acl_mem_type type);
/**
* 某种分配类型所分配的内存中当前正在被使用的内存大小
* @param allocator {ACL_ALLOCATOR*}
* @param type {acl_mem_type} 内存类型
* @return {int} 某种分配类型所分配的内存中当前正在被使用的内存大小,单位为字节
*/
ACL_API int acl_allocator_pool_inuse_size(ACL_ALLOCATOR *allocator, acl_mem_type type);
/**
* 内存分配池总共分配的且正在被使用的内存的大小
* @param allocator {ACL_ALLOCATOR*}
* @return {int} 内存大小,单位:字节
*/
ACL_API int acl_allocator_pool_total_allocated(ACL_ALLOCATOR *allocator);
/**
* 分配某种内存类型的内存
* @param filename {const char*}
* @param line {int}
* @param allocator {ACL_ALLOCATOR*}
* @param type {acl_mem_type} 内存类型
* @return {void*} 新分配的内存的地址
*/
ACL_API void *acl_allocator_mem_alloc(const char *filename, int line,
ACL_ALLOCATOR *allocator, acl_mem_type type);
/**
* 释放某种内存类型的内存空间
* @param filename {const char*}
* @param line {int}
* @param allocator {ACL_ALLOCATOR*}
* @param type {acl_mem_type} 内存类型
* @param obj {void*} 被释放的内存对象,不能为空
*/
ACL_API void acl_allocator_mem_free(const char *filename, int line,
ACL_ALLOCATOR *allocator, acl_mem_type type, void *obj);
/**
* 根据所要求的内存大小,自动进行内存分配类型匹配,若找到所匹配的类型,则采用内存池
* 的内存分配策略,否则直接调用 acl_mymalloc 进行内存分配
* @param filename {const char*} 调用本函数的当前文件名
* @param line {int} 调用本函数的当前文件行号
* @param allocator {ACL_ALLOCATOR*}
* @param size {size_t} 调用者所申请的内存大小
* @return {void*} 新分配的内存的地址
*/
ACL_API void *acl_allocator_membuf_alloc(const char *filename, int line,
ACL_ALLOCATOR *allocator, size_t size);
/**
* 根据所申请的内存大小,重新分配内存空间,若找到所匹配的类型,则采用内存池
* 内存分配策略,否则直播调用 acl_mymalloc 进行内存分配
* @param filename {const char*} 调用本函数的当前文件名
* @param line {int} 调用本函数的当前文件行号
* @param allocator {ACL_ALLOCATOR*}
* @param oldbuf {void*} 原来分配的内存
* @param size {size_t} 本次申请的内存大小
* @return {void*} 新分配的内存的地址
*/
ACL_API void *acl_allocator_membuf_realloc(const char *filename, int line,
ACL_ALLOCATOR *allocator, void *oldbuf, size_t size);
/**
* 释放内存, 如果能找到该大小的内存所属的内存分配类型,则进行缓冲,否则直播调用
* acl_myfree 进行释放
* @param filename {const char*} 调用本函数的当前文件名
* @param line {int} 调用本函数的当前文件行号
* @param allocator {ACL_ALLOCATOR*}
* @param buf {void*} 内存地址
*/
ACL_API void acl_allocator_membuf_free(const char *filename, int line,
ACL_ALLOCATOR *allocator, void *buf);
#ifdef __cplusplus
}
#endif
#endif