acl  3.5.3.0
acl_cache2.h
浏览该文件的文档.
1 #ifndef ACL_CACHE2_INCLUDE_H
2 #define ACL_CACHE2_INCLUDE_H
3 
4 #ifdef __cplusplus
5 extern "C" {
6 #endif
7 #include "acl_define.h"
8 #include <time.h>
9 
10 typedef struct ACL_CACHE2 ACL_CACHE2;
11 
12 /**
13  * 缓存池中存储的缓存对象
14  */
15 typedef struct ACL_CACHE2_INFO {
16  char *key; /**< 健值 */
17  void *value; /**< 用户动态对象 */
18  int nrefer; /**< 引用计数 */
19  time_t when_timeout; /**< 过期时间截 */
20  ACL_CACHE2* cache; /**< 引用缓存对象 */
22 
23 /**
24  * 缓冲池
25  */
26 struct ACL_CACHE2 {
27  int max_size; /**< 缓存池容量大小限制值 */
28  int size; /**< 当前缓存池中的缓存对象个数 */
29  void *ctx; /**< 外部引用对象 */
30 
31  /**< 释放用户动态对象的释放回调函数 */
32  void (*free_fn)(const ACL_CACHE2_INFO*, void *);
33 
34  /* for acl_iterator */
35 
36  /* 取迭代器头函数 */
37  void *(*iter_head)(ACL_ITER*, struct ACL_CACHE2*);
38  /* 取迭代器下一个函数 */
39  void *(*iter_next)(ACL_ITER*, struct ACL_CACHE2*);
40  /* 取迭代器尾函数 */
41  void *(*iter_tail)(ACL_ITER*, struct ACL_CACHE2*);
42  /* 取迭代器上一个函数 */
43  void *(*iter_prev)(ACL_ITER*, struct ACL_CACHE2*);
44  /* 取迭代器关联的当前容器成员结构对象 */
45  ACL_CACHE2_INFO *(*iter_info)(ACL_ITER*, struct ACL_CACHE2*);
46 };
47 
48 /**
49  * 创建一个缓存池,并设置每个缓存对象的最大缓存时长及该缓存池的空间容量限制
50  * @param max_size {int} 该缓存池的容量限制,若该值 <= 0,则内部不会限制缓存量
51  * @param free_fn {void (*)(void*)} 用户级的释放缓存对象的函数
52  * @return {ACL_CACHE2*} 缓存池对象句柄
53  */
55  void (*free_fn)(const ACL_CACHE2_INFO*, void*));
56 
57 /**
58  * 释放一个缓存池
59  * @param cache2 {ACL_CACHE2*} 缓存池对象句柄
60  */
61 ACL_API void acl_cache2_free(ACL_CACHE2 *cache2);
62 
63 /**
64  * 向缓存池中添加被缓存的对象
65  * @param cache2 {ACL_CACHE2*} 缓存池对象句柄
66  * @param key {const char*} 缓存对象的健值
67  * @param value {void*} 动态缓存对象
68  * @param timeout {int} 每个缓存对象的缓存时长
69  * @return {ACL_CACHE2_INFO*} 缓存对象所依附的结构对象,其中的 value 与用户的
70  * 对象相同, 如果返回 NULL 则表示添加失败,失败原因为:缓存池太大溢出或相同
71  * 健值的对象存在且引用计数非0; 如果返回非 NULL 则表示添加成功,如果对同一健
72  * 值的重复添加,会用新的数据替换旧的数据,且旧数据调用释放函数进行释放
73  */
75  const char *key, void *value, int timeout);
76 
77 /**
78  * 从缓存池中查找某个被缓存的对象
79  * @param cache2 {ACL_CACHE2*} 缓存池对象句柄
80  * @param key {const char*} 查询健
81  * @return {void*} 被缓存的用户对象的地址,为NULL时表示未找到
82  */
83 ACL_API void *acl_cache2_find(ACL_CACHE2 *cache2, const char *key);
84 
85 /**
86  * 从缓存池中查找某个被缓存的对象所依附的缓存信息对象
87  * @param cache2 {ACL_CACHE2*} 缓存池对象句柄
88  * @param key {const char*} 查询健
89  * @return {ACL_CACHE2_INFO*} 缓存信息对象地址,为NULL时表示未找到
90  */
91 ACL_API ACL_CACHE2_INFO *acl_cache2_locate(ACL_CACHE2 *cache2, const char *key);
92 
93 /**
94  * 从缓存池中删除某个缓存对象
95  * @param cache2 {ACL_CACHE2*} 缓存池对象句柄
96  * @param info {ACL_CACHE2_INFO*} 用户对象所依附的缓存信息对象
97  * @return {int} 0: 表示删除成功; -1: 表示该对象的引用计数非0或该对象不存在
98  */
99 ACL_API int acl_cache2_delete(ACL_CACHE2 *cache2, ACL_CACHE2_INFO *info);
100 
101 /**
102  * 从缓存池中删除某个缓存对象
103  * @param cache2 {ACL_CACHE2*} 缓存池对象句柄
104  * @param key {const char*} 健值
105  * @return {int} 0: 表示删除成功; -1: 表示该对象的引用计数非0或该对象不存在
106  */
107 ACL_API int acl_cache2_delete2(ACL_CACHE2 *cache2, const char *key);
108 
109 /**
110  * 使缓存池中的过期对象被自动删除
111  * @param cache2 {ACL_CACHE2*} 缓存池对象句柄
112  * @return {int} >= 0: 被自动删除的缓存对象的个数
113  */
114 ACL_API int acl_cache2_timeout(ACL_CACHE2 *cache2);
115 
116 /**
117  * 使某个缓存对象的缓存时间加长
118  * @param cache2 {ACL_CACHE2*} 缓存池对象句柄
119  * @param info {ACL_CACHE2_INFO*} 缓存对象
120  * @param timeout {int} 缓存时长(秒)
121  * @return {ACL_CACHE2_INFO*} 返回非 NULL 表示正常,为 NULL 表示 key 不存在
122  */
124  ACL_CACHE2_INFO *info, int timeout);
125 
126 /**
127  * 使某个缓存对象的缓存时间加长
128  * @param cache2 {ACL_CACHE2*} 缓存池对象句柄
129  * @param key {const char*} 健值
130  * @param timeout {int} 缓存时长(秒)
131  * @return {ACL_CACHE2_INFO*} 返回非 NULL 表示正常,为 NULL 表示 key 不存在
132  */
134  const char *key, int timeout);
135 
136 /**
137  * 添加或更新缓存中的对象
138  * @param key {const char*} 缓存对象的健值
139  * @param value {void*} 动态缓存对象
140  * @param timeout {int} 每个缓存对象的缓存时长
141  * @param exist {int*} 非 NULL 时,如果新 key 存在则被置 1,否则置 0
142  * @return {ACL_CACHE2_INFO*} 缓存对象所依附的结构对象,其中的 value 与用户的
143  * 对象相同;如果该 key 不存在则添加新对象,如果存在则更新旧对象;返回 NULL
144  * 表示更新添加失败;如果是更新方式,则调用者应注意释放临时创建的动态对象
145  */
147  const char *key, void *value, int timeout, int *exist);
148 
149 /**
150  * 获取按时间排序后的头部对象,调用者可从 ACL_CACHE2_INFO::value 获得应用对象
151  * @param cache2 {ACL_CACHE2*}
152  * @return {ACL_CACHE2_INFO*} 返回 NULL 表示缓存对象为空
153  */
154 ACL_API ACL_CACHE2_INFO *acl_cache2_head(ACL_CACHE2 *cache2);
155 
156 /**
157  * 获取按时间排序后的尾部对象,调用者可从 ACL_CACHE2_INFO::value 获得应用对象
158  * @param cache2 {ACL_CACHE2*}
159  * @return {ACL_CACHE2_INFO*} 返回 NULL 表示缓存对象为空
160  */
161 ACL_API ACL_CACHE2_INFO *acl_cache2_tail(ACL_CACHE2 *cache2);
162 
163 /**
164  * 增加某缓存对象的引用计数,防止被提前删除
165  * @param info {ACL_CACHE2_INFO*} 用户对象所依附的缓存信息对象
166  */
167 ACL_API void acl_cache2_refer(ACL_CACHE2_INFO *info);
168 
169 /**
170  * 增加某缓存对象的引用计数,防止被提前删除
171  * @param cache2 {ACL_CACHE2*} 缓存池对象句柄
172  * @param key {const char*}
173  */
174 ACL_API void acl_cache2_refer2(ACL_CACHE2 *cache2, const char *key);
175 
176 /**
177  * 减少某缓存对象的引用计数
178  * @param info {ACL_CACHE2_INFO*} 用户对象所依附的缓存信息对象
179  */
180 ACL_API void acl_cache2_unrefer(ACL_CACHE2_INFO *info);
181 
182 /**
183  * 减少某缓存对象的引用计数
184  * @param cache2 {ACL_CACHE2*} 缓存池对象句柄
185  * @param key {const char*}
186  */
187 ACL_API void acl_cache2_unrefer2(ACL_CACHE2 *cache2, const char *key);
188 
189 /**
190  * 加锁缓存池对象,在多线程时用
191  * @param cache2 {ACL_CACHE2*} 缓存池对象句柄
192  */
193 ACL_API void acl_cache2_lock(ACL_CACHE2 *cache2);
194 
195 /**
196  * 解锁缓存池对象,在多线程时用
197  * @param cache2 {ACL_CACHE2*} 缓存池对象句柄
198  */
199 ACL_API void acl_cache2_unlock(ACL_CACHE2 *cache2);
200 
201 /**
202  * 遍历缓存中的所有对象
203  * @param cache2 {ACL_CACHE2*} 缓存池对象句柄
204  * @param walk_fn {void (*)(ACL_CACHE2_INFO*, void*)} 遍历回调函数
205  * @param arg {void *} walk_fn()/2 中的第二个参数
206  */
207 ACL_API void acl_cache2_walk(ACL_CACHE2 *cache2,
208  void (*walk_fn)(ACL_CACHE2_INFO *, void *), void *arg);
209 
210 /**
211  * 清空缓存池中的缓存对象,如果某个缓存对象依然在被引用且非强制性删除,则将不会被清空
212  * @param cache2 {ACL_CACHE2*} 缓存池对象句柄
213  * @param force {int} 如果非0,则即使某个缓存对象的引用计数非0也会被删除
214  * @return {int} 被清除的缓存对象个数
215  */
216 ACL_API int acl_cache2_clean(ACL_CACHE2 *cache2, int force);
217 
218 /**
219  * 当前缓存池中缓存对象的个数
220  * @param cache2 {ACL_CACHE2*} 缓存池对象句柄
221  * @return {int} 被缓存的对象个数
222  */
223 ACL_API int acl_cache2_size(ACL_CACHE2 *cache2);
224 
225 #ifdef __cplusplus
226 }
227 #endif
228 
229 #endif
ACL_API void acl_cache2_unrefer2(ACL_CACHE2 *cache2, const char *key)
struct ACL_CACHE2_INFO ACL_CACHE2_INFO
ACL_API void acl_cache2_refer(ACL_CACHE2_INFO *info)
ACL_API ACL_CACHE2_INFO * acl_cache2_tail(ACL_CACHE2 *cache2)
ACL_API ACL_CACHE2_INFO * acl_cache2_update(ACL_CACHE2 *cache2, const char *key, int timeout)
ACL_API int acl_cache2_size(ACL_CACHE2 *cache2)
ACL_API ACL_CACHE2_INFO * acl_cache2_upsert(ACL_CACHE2 *cache2, const char *key, void *value, int timeout, int *exist)
void(* free_fn)(const ACL_CACHE2_INFO *, void *)
Definition: acl_cache2.h:32
ACL_API ACL_CACHE2_INFO * acl_cache2_update2(ACL_CACHE2 *cache2, ACL_CACHE2_INFO *info, int timeout)
ACL_API int acl_cache2_clean(ACL_CACHE2 *cache2, int force)
ACL_API void acl_cache2_unlock(ACL_CACHE2 *cache2)
ACL_API ACL_CACHE2_INFO * acl_cache2_locate(ACL_CACHE2 *cache2, const char *key)
ACL_CACHE2 * cache
Definition: acl_cache2.h:20
ACL_API void acl_cache2_walk(ACL_CACHE2 *cache2, void(*walk_fn)(ACL_CACHE2_INFO *, void *), void *arg)
int max_size
Definition: acl_cache2.h:27
ACL_API void acl_cache2_free(ACL_CACHE2 *cache2)
ACL_API void acl_cache2_refer2(ACL_CACHE2 *cache2, const char *key)
ACL_API int acl_cache2_delete(ACL_CACHE2 *cache2, ACL_CACHE2_INFO *info)
time_t when_timeout
Definition: acl_cache2.h:19
ACL_API void * acl_cache2_find(ACL_CACHE2 *cache2, const char *key)
void * ctx
Definition: acl_cache2.h:29
ACL_API void acl_cache2_lock(ACL_CACHE2 *cache2)
ACL_API int acl_cache2_timeout(ACL_CACHE2 *cache2)
ACL_API ACL_CACHE2_INFO * acl_cache2_enter(ACL_CACHE2 *cache2, const char *key, void *value, int timeout)
ACL_API int acl_cache2_delete2(ACL_CACHE2 *cache2, const char *key)
ACL_API void acl_cache2_unrefer(ACL_CACHE2_INFO *info)
ACL_API ACL_CACHE2_INFO * acl_cache2_head(ACL_CACHE2 *cache2)
ACL_API ACL_CACHE2 * acl_cache2_create(int max_size, void(*free_fn)(const ACL_CACHE2_INFO *, void *))