acl  3.5.3.0
acl_allocator.h
浏览该文件的文档.
1 #ifndef ACL_ALLOCATOR_INCLUDE_H
2 #define ACL_ALLOCATOR_INCLUDE_H
3 
4 #ifdef __cplusplus
5 extern "C" {
6 #endif
7 
8 #ifndef ACL_PREPARE_COMPILE
9 #include "acl_define.h"
10 #include <stdlib.h>
11 #endif
12 
13 typedef enum {
35 } acl_mem_type;
36 
37 typedef struct ACL_MEM_POOL ACL_MEM_POOL;
39 
40 /* in acl_mpool.c */
41 /**
42  * 创建一个内存分配池对象
43  * @param mem_limit {size_t} 内存池的最大内存,单位为字节
44  * @return {ACL_ALLOCATOR *} 内存分配池对象指针
45  */
46 ACL_API ACL_ALLOCATOR *acl_allocator_create(size_t mem_limit);
47 
48 /**
49  * 控制内存分配池的一些参数
50  * @param name {int} 参数列表的第一个参数
51  * 调用方式如下:
52  * acl_allocator_ctl(ACL_ALLOCATOR_CTL_MIN_SIZE, 128,
53  * ACL_ALLOCATOR_CTL_MAX_SIZE, 1024,
54  * ACL_ALLOCATOR_CTL_END);
55  */
56 ACL_API void acl_allocator_ctl(int name, ...);
57 
58 #define ACL_ALLOCATOR_CTL_END 0 /**< 结束标记 */
59 #define ACL_ALLOCATOR_CTL_MIN_SIZE 1 /**< 设置最小字节数 */
60 #define ACL_ALLOCATOR_CTL_MAX_SIZE 2 /**< 设置最大字节数 */
61 
62 /**
63  * 配置内存分配池的容量大小
64  * @param allocator {ACL_ALLOCATOR*}
65  * @param mem_limit {size_t} 内存池的最大值,单位为字节
66  */
67 ACL_API void acl_allocator_config(ACL_ALLOCATOR *allocator, size_t mem_limit);
68 
69 /**
70  * 释放内存分配池对象及其所管理的内存
71  * @param allocator {ACL_ALLOCATOR*}
72  */
73 ACL_API void acl_allocator_free(ACL_ALLOCATOR *allocator);
74 
75 /**
76  * 添加一个新的内存分配类型
77  * @param allocator {ACL_ALLOCATOR*}
78  * @param label {const char*} 该内存分配类型的描述信息
79  * @param obj_size {size_t} 每个该内存类型的大小,单位为字节
80  * @param type {acl_mem_type} 内存类型
81  * @param after_alloc_fn {void (*)(void*, void*)} 分配内存成功后调用的函数,可以为空
82  * @param before_free_fn {void (*)(void*, void*)} 释放内存前回调的函数,可以为空
83  * @param pool_ctx {void*} 应用自己的私有对象,如果 after_alloc_fn 或 before_free_fn
84  * 不为空,则回调时将此参数直接传递给应用
85  * @return {ACL_MEM_POOL*} 该内存分配类型所对应的对象
86  */
88  const char *label,
89  size_t obj_size,
90  acl_mem_type type,
91  void (*after_alloc_fn)(void *obj, void *pool_ctx),
92  void (*before_free_fn)(void *obj, void *pool_ctx),
93  void *pool_ctx);
94 
95 /**
96  * 从内存分配池中移除某种内存分配类型
97  * @param allocator {ACL_ALLOCATOR*}
98  * @param pool {ACL_MEM_POOL*} 由 acl_allocatore_pool_add 返回的对象
99  */
100 ACL_API void acl_allocator_pool_remove(ACL_ALLOCATOR *allocator, ACL_MEM_POOL *pool);
101 
102 /**
103  * 探测某种分配类型是否存在于内存分配池的内存分配类型中
104  * @param allocator {ACL_ALLOCATOR*}
105  * @param type {acl_mem_type} 内存类型
106  * @return {int}, 0: 否,!= 0: 是
107  */
108 ACL_API int acl_allocator_pool_ifused(ACL_ALLOCATOR *allocator, acl_mem_type type);
109 
110 /**
111  * 某种分配类型的内存对象当前被使用的个数
112  * @param allocator {ACL_ALLOCATOR*}
113  * @param type {acl_mem_type} 内存类型
114  * @return {int} 当前正在被使用的某种内存分配类型的内存对象个数
115  */
116 ACL_API int acl_allocator_pool_inuse_count(ACL_ALLOCATOR *allocator, acl_mem_type type);
117 
118 /**
119  * 某种分配类型所分配的内存中当前正在被使用的内存大小
120  * @param allocator {ACL_ALLOCATOR*}
121  * @param type {acl_mem_type} 内存类型
122  * @return {int} 某种分配类型所分配的内存中当前正在被使用的内存大小,单位为字节
123  */
124 ACL_API int acl_allocator_pool_inuse_size(ACL_ALLOCATOR *allocator, acl_mem_type type);
125 
126 /**
127  * 内存分配池总共分配的且正在被使用的内存的大小
128  * @param allocator {ACL_ALLOCATOR*}
129  * @return {int} 内存大小,单位:字节
130  */
131 ACL_API int acl_allocator_pool_total_allocated(ACL_ALLOCATOR *allocator);
132 
133 /**
134  * 分配某种内存类型的内存
135  * @param filename {const char*}
136  * @param line {int}
137  * @param allocator {ACL_ALLOCATOR*}
138  * @param type {acl_mem_type} 内存类型
139  * @return {void*} 新分配的内存的地址
140  */
141 ACL_API void *acl_allocator_mem_alloc(const char *filename, int line,
142  ACL_ALLOCATOR *allocator, acl_mem_type type);
143 
144 /**
145  * 释放某种内存类型的内存空间
146  * @param filename {const char*}
147  * @param line {int}
148  * @param allocator {ACL_ALLOCATOR*}
149  * @param type {acl_mem_type} 内存类型
150  * @param obj {void*} 被释放的内存对象,不能为空
151  */
152 ACL_API void acl_allocator_mem_free(const char *filename, int line,
153  ACL_ALLOCATOR *allocator, acl_mem_type type, void *obj);
154 
155 /**
156  * 根据所要求的内存大小,自动进行内存分配类型匹配,若找到所匹配的类型,则采用内存池
157  * 的内存分配策略,否则直接调用 acl_mymalloc 进行内存分配
158  * @param filename {const char*} 调用本函数的当前文件名
159  * @param line {int} 调用本函数的当前文件行号
160  * @param allocator {ACL_ALLOCATOR*}
161  * @param size {size_t} 调用者所申请的内存大小
162  * @return {void*} 新分配的内存的地址
163  */
164 ACL_API void *acl_allocator_membuf_alloc(const char *filename, int line,
165  ACL_ALLOCATOR *allocator, size_t size);
166 
167 /**
168  * 根据所申请的内存大小,重新分配内存空间,若找到所匹配的类型,则采用内存池
169  * 内存分配策略,否则直播调用 acl_mymalloc 进行内存分配
170  * @param filename {const char*} 调用本函数的当前文件名
171  * @param line {int} 调用本函数的当前文件行号
172  * @param allocator {ACL_ALLOCATOR*}
173  * @param oldbuf {void*} 原来分配的内存
174  * @param size {size_t} 本次申请的内存大小
175  * @return {void*} 新分配的内存的地址
176  */
177 ACL_API void *acl_allocator_membuf_realloc(const char *filename, int line,
178  ACL_ALLOCATOR *allocator, void *oldbuf, size_t size);
179 
180 /**
181  * 释放内存, 如果能找到该大小的内存所属的内存分配类型,则进行缓冲,否则直播调用
182  * acl_myfree 进行释放
183  * @param filename {const char*} 调用本函数的当前文件名
184  * @param line {int} 调用本函数的当前文件行号
185  * @param allocator {ACL_ALLOCATOR*}
186  * @param buf {void*} 内存地址
187  */
188 ACL_API void acl_allocator_membuf_free(const char *filename, int line,
189  ACL_ALLOCATOR *allocator, void *buf);
190 
191 #ifdef __cplusplus
192 }
193 #endif
194 
195 #endif
ACL_API void * acl_allocator_membuf_realloc(const char *filename, int line, ACL_ALLOCATOR *allocator, void *oldbuf, size_t size)
struct ACL_MEM_POOL ACL_MEM_POOL
Definition: acl_allocator.h:37
acl_mem_type
Definition: acl_allocator.h:13
ACL_API int acl_allocator_pool_ifused(ACL_ALLOCATOR *allocator, acl_mem_type type)
HTTP_API void const char * name
Definition: lib_http.h:620
ACL_API void acl_allocator_membuf_free(const char *filename, int line, ACL_ALLOCATOR *allocator, void *buf)
ACL_API void * acl_allocator_membuf_alloc(const char *filename, int line, ACL_ALLOCATOR *allocator, size_t size)
ACL_API void acl_allocator_free(ACL_ALLOCATOR *allocator)
ACL_API void acl_allocator_mem_free(const char *filename, int line, ACL_ALLOCATOR *allocator, acl_mem_type type, void *obj)
ACL_API ACL_ALLOCATOR * acl_allocator_create(size_t mem_limit)
ACL_API int acl_allocator_pool_total_allocated(ACL_ALLOCATOR *allocator)
ACL_API int acl_allocator_pool_inuse_count(ACL_ALLOCATOR *allocator, acl_mem_type type)
ACL_API void * acl_allocator_mem_alloc(const char *filename, int line, ACL_ALLOCATOR *allocator, acl_mem_type type)
ACL_API void acl_allocator_pool_remove(ACL_ALLOCATOR *allocator, ACL_MEM_POOL *pool)
ACL_API void acl_allocator_ctl(int name,...)
ACL_API void acl_allocator_config(ACL_ALLOCATOR *allocator, size_t mem_limit)
ACL_API int acl_allocator_pool_inuse_size(ACL_ALLOCATOR *allocator, acl_mem_type type)
struct ACL_ALLOCATOR ACL_ALLOCATOR
Definition: acl_allocator.h:38
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)