acl  3.5.3.0
acl_cache.h
浏览该文件的文档.
1 #ifndef ACL_CACHE_INCLUDE_H
2 #define ACL_CACHE_INCLUDE_H
3 
4 #ifdef __cplusplus
5 extern "C" {
6 #endif
7 #include "acl_define.h"
8 #include "acl_htable.h"
9 #include "acl_ring.h"
10 #include <time.h>
11 
12 /**
13  * 缓存池中存储的缓存对象
14  */
15 typedef struct ACL_CACHE_INFO {
16  char *key; /**< 健值 */
17  void *value; /**< 用户动态对象 */
18  int nrefer; /**< 引用计数 */
19  time_t when_timeout; /**< 过期时间截 */
20  ACL_RING entry; /**< 内部数据链成员 */
22 
23 /**
24  * 缓冲池
25  */
26 typedef struct ACL_CACHE {
27  ACL_HTABLE *table; /**< 哈希表 */
28  ACL_RING ring; /**< 将被删除的对象的数据链表 */
29  int max_size; /**< 缓存池容量大小限制值 */
30  int size; /**< 当前缓存池中的缓存对象个数 */
31  int timeout; /**< 每个缓存对象的生存时长(秒) */
32 
33  /**< 释放用户动态对象的释放回调函数 */
34  void (*free_fn)(const ACL_CACHE_INFO*, void *);
35  acl_pthread_mutex_t lock; /**< 缓存池锁 */
36  ACL_SLICE *slice; /**< 内存切片对象 */
37 
38  /* for acl_iterator */
39 
40  /* 取迭代器头函数 */
41  void *(*iter_head)(ACL_ITER*, struct ACL_CACHE*);
42  /* 取迭代器下一个函数 */
43  void *(*iter_next)(ACL_ITER*, struct ACL_CACHE*);
44  /* 取迭代器尾函数 */
45  void *(*iter_tail)(ACL_ITER*, struct ACL_CACHE*);
46  /* 取迭代器上一个函数 */
47  void *(*iter_prev)(ACL_ITER*, struct ACL_CACHE*);
48  /* 取迭代器关联的当前容器成员结构对象 */
49  ACL_CACHE_INFO *(*iter_info)(ACL_ITER*, struct ACL_CACHE*);
50 } ACL_CACHE;
51 
52 /**
53  * 创建一个缓存池,并设置每个缓存对象的最大缓存时长及该缓存池的空间容量限制
54  * @param max_size {int} 该缓存池的容量限制
55  * @param timeout {int} 每个缓存对象的缓存时长
56  * @param free_fn {void (*)(void*)} 用户级的释放缓存对象的函数
57  * @return {ACL_CACHE*} 缓存池对象句柄
58  */
59 ACL_API ACL_CACHE *acl_cache_create(int max_size, int timeout,
60  void (*free_fn)(const ACL_CACHE_INFO*, void*));
61 
62 /**
63  * 释放一个缓存池,并自动调用 acl_cache_create()/3 中的释放函数释放缓存对象
64  * @param cache {ACL_CACHE*} 缓存池对象句柄
65  */
66 ACL_API void acl_cache_free(ACL_CACHE *cache);
67 
68 /**
69  * 向缓存池中添加被缓存的对象
70  * @param cache {ACL_CACHE*} 缓存池对象句柄
71  * @param key {const char*} 缓存对象的健值
72  * @param value {void*} 动态缓存对象
73  * @return {ACL_CACHE_INFO*} 缓存对象所依附的结构对象,其中的 value 与用户的对象相同,
74  * 如果返回 NULL 则表示添加失败,失败原因为:缓存池太大溢出或相同健值的对象存在
75  * 且引用计数非0; 如果返回非 NULL 则表示添加成功,如果对同一健值的重复添加,会用
76  * 新的数据替换旧的数据,且旧数据调用释放函数进行释放
77  */
78 ACL_API ACL_CACHE_INFO *acl_cache_enter(ACL_CACHE *cache, const char *key, void *value);
79 
80 /**
81  * 从缓存池中查找某个被缓存的对象
82  * @param cache {ACL_CACHE*} 缓存池对象句柄
83  * @param key {const char*} 查询健
84  * @return {void*} 被缓存的用户对象的地址,为NULL时表示未找到
85  */
86 ACL_API void *acl_cache_find(ACL_CACHE *cache, const char *key);
87 
88 /**
89  * 从缓存池中查找某个被缓存的对象所依附的缓存信息对象
90  * @param cache {ACL_CACHE*} 缓存池对象句柄
91  * @param key {const char*} 查询健
92  * @return {ACL_CACHE_INFO*} 缓存信息对象地址,为NULL时表示未找到
93  */
94 ACL_API ACL_CACHE_INFO *acl_cache_locate(ACL_CACHE *cache, const char *key);
95 
96 /**
97  * 从缓存池中删除某个缓存对象
98  * @param cache {ACL_CACHE*} 缓存池对象句柄
99  * @param info {ACL_CACHE_INFO*} 用户对象所依附的缓存信息对象
100  * @return {int} 0: 表示删除成功; -1: 表示该对象的引用计数非0或该对象不存在
101  */
102 ACL_API int acl_cache_delete(ACL_CACHE *cache, ACL_CACHE_INFO *info);
103 
104 /**
105  * 从缓存池中删除某个缓存对象
106  * @param cache {ACL_CACHE*} 缓存池对象句柄
107  * @param key {const char*} 健值
108  * @return {int} 0: 表示删除成功; -1: 表示该对象的引用计数非0或该对象不存在
109  */
110 ACL_API int acl_cache_delete2(ACL_CACHE *cache, const char *key);
111 
112 /**
113  * 使缓存池中的过期对象被自动删除
114  * @param cache {ACL_CACHE*} 缓存池对象句柄
115  * @return {int} >= 0: 被自动删除的缓存对象的个数
116  */
117 ACL_API int acl_cache_timeout(ACL_CACHE *cache);
118 
119 /**
120  * 使某个缓存对象的缓存时间加长
121  * @param cache {ACL_CACHE*} 缓存池对象句柄
122  * @param info {ACL_CACHE_INFO*} 缓存对象
123  * @param timeout {int} 缓存时长(秒)
124  */
125 ACL_API void acl_cache_update2(ACL_CACHE *cache, ACL_CACHE_INFO *info, int timeout);
126 
127 /**
128  * 使某个缓存对象的缓存时间加长
129  * @param cache {ACL_CACHE*} 缓存池对象句柄
130  * @param key {const char*} 健值
131  * @param timeout {int} 缓存时长(秒)
132  */
133 ACL_API void acl_cache_update(ACL_CACHE *cache, const char *key, int timeout);
134 
135 /**
136  * 增加某缓存对象的引用计数,防止被提前删除
137  * @param info {ACL_CACHE_INFO*} 用户对象所依附的缓存信息对象
138  */
139 ACL_API void acl_cache_refer(ACL_CACHE_INFO *info);
140 
141 /**
142  * 增加某缓存对象的引用计数,防止被提前删除
143  * @param cache {ACL_CACHE*} 缓存池对象句柄
144  * @param key {const char*}
145  */
146 ACL_API void acl_cache_refer2(ACL_CACHE *cache, const char *key);
147 
148 /**
149  * 减少某缓存对象的引用计数
150  * @param info {ACL_CACHE_INFO*} 用户对象所依附的缓存信息对象
151  */
152 ACL_API void acl_cache_unrefer(ACL_CACHE_INFO *info);
153 
154 /**
155  * 减少某缓存对象的引用计数
156  * @param cache {ACL_CACHE*} 缓存池对象句柄
157  * @param key {const char*}
158  */
159 ACL_API void acl_cache_unrefer2(ACL_CACHE *cache, const char *key);
160 
161 /**
162  * 加锁缓存池对象,在多线程时用
163  * @param cache {ACL_CACHE*} 缓存池对象句柄
164  */
165 ACL_API void acl_cache_lock(ACL_CACHE *cache);
166 
167 /**
168  * 解锁缓存池对象,在多线程时用
169  * @param cache {ACL_CACHE*} 缓存池对象句柄
170  */
171 ACL_API void acl_cache_unlock(ACL_CACHE *cache);
172 
173 /**
174  * 遍历缓存中的所有对象
175  * @param cache {ACL_CACHE*} 缓存池对象句柄
176  * @param walk_fn {void (*)(ACL_CACHE_INFO*, void*)} 遍历回调函数
177  * @param arg {void *} walk_fn()/2 中的第二个参数
178  */
179 ACL_API void acl_cache_walk(ACL_CACHE *cache, void (*walk_fn)(ACL_CACHE_INFO *, void *), void *arg);
180 
181 /**
182  * 清空缓存池中的缓存对象,如果某个缓存对象依然在被引用且非强制性删除,则将不会被清空
183  * @param cache {ACL_CACHE*} 缓存池对象句柄
184  * @param force {int} 如果非0,则即使某个缓存对象的引用计数非0也会被删除
185  * @return {int} 被清除的缓存对象个数
186  */
187 ACL_API int acl_cache_clean(ACL_CACHE *cache, int force);
188 
189 /**
190  * 当前缓存池中缓存对象的个数
191  * @param cache {ACL_CACHE*} 缓存池对象句柄
192  * @return {int} 被缓存的对象个数
193  */
194 ACL_API int acl_cache_size(ACL_CACHE *cache);
195 
196 #ifdef __cplusplus
197 }
198 #endif
199 
200 #endif
void * value
Definition: acl_cache.h:17
ACL_RING ring
Definition: acl_cache.h:28
ACL_API ACL_CACHE_INFO * acl_cache_enter(ACL_CACHE *cache, const char *key, void *value)
ACL_API int acl_cache_timeout(ACL_CACHE *cache)
ACL_API int acl_cache_size(ACL_CACHE *cache)
ACL_API void acl_cache_update2(ACL_CACHE *cache, ACL_CACHE_INFO *info, int timeout)
ACL_HTABLE * table
Definition: acl_cache.h:27
ACL_RING entry
Definition: acl_cache.h:20
ACL_API void acl_cache_refer2(ACL_CACHE *cache, const char *key)
ACL_API int acl_cache_delete(ACL_CACHE *cache, ACL_CACHE_INFO *info)
ACL_API ACL_CACHE * acl_cache_create(int max_size, int timeout, void(*free_fn)(const ACL_CACHE_INFO *, void *))
ACL_API void acl_cache_free(ACL_CACHE *cache)
ACL_API void acl_cache_unrefer2(ACL_CACHE *cache, const char *key)
struct ACL_CACHE ACL_CACHE
ACL_API void acl_cache_unrefer(ACL_CACHE_INFO *info)
ACL_API void acl_cache_update(ACL_CACHE *cache, const char *key, int timeout)
time_t when_timeout
Definition: acl_cache.h:19
int timeout
Definition: acl_cache.h:31
ACL_API void acl_cache_refer(ACL_CACHE_INFO *info)
ACL_SLICE * slice
Definition: acl_cache.h:36
int size
Definition: acl_cache.h:30
ACL_API int acl_cache_clean(ACL_CACHE *cache, int force)
ACL_API void acl_cache_unlock(ACL_CACHE *cache)
struct ACL_CACHE_INFO ACL_CACHE_INFO
acl_pthread_mutex_t lock
Definition: acl_cache.h:35
ACL_API void acl_cache_lock(ACL_CACHE *cache)
ACL_API void acl_cache_walk(ACL_CACHE *cache, void(*walk_fn)(ACL_CACHE_INFO *, void *), void *arg)
ACL_API void * acl_cache_find(ACL_CACHE *cache, const char *key)
ACL_API int acl_cache_delete2(ACL_CACHE *cache, const char *key)
struct ACL_SLICE ACL_SLICE
Definition: acl_slice.h:33
int max_size
Definition: acl_cache.h:29
ACL_API ACL_CACHE_INFO * acl_cache_locate(ACL_CACHE *cache, const char *key)
char * key
Definition: acl_cache.h:16
void(* free_fn)(const ACL_CACHE_INFO *, void *)
Definition: acl_cache.h:34