xref: /f-stack/app/micro_thread/mt_cache.h (revision a9643ea8)
1 
2 /**
3  * Tencent is pleased to support the open source community by making MSEC available.
4  *
5  * Copyright (C) 2016 THL A29 Limited, a Tencent company. All rights reserved.
6  *
7  * Licensed under the GNU General Public License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License. You may
9  * obtain a copy of the License at
10  *
11  *     https://opensource.org/licenses/GPL-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software distributed under the
14  * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
15  * either express or implied. See the License for the specific language governing permissions
16  * and limitations under the License.
17  */
18 
19 
20 /**
21  *  @filename mt_cache.h
22  *  @info   TCP����buffer������
23  */
24 
25 #ifndef ___MT_BUFFER_CACHE_H
26 #define ___MT_BUFFER_CACHE_H
27 
28 #include <stdint.h>
29 #include <sys/queue.h>
30 
31 
32 namespace NS_MICRO_THREAD {
33 
34 
35 // Ĭ�ϵ�buff��С
36 #define SK_DFLT_BUFF_SIZE   64*1024
37 #define SK_DFLT_ALIGN_SIZE  8
38 
39 #define SK_ERR_NEED_CLOSE   10000
40 
41 /**
42  * @brief  �û�̬ buffer �ṹ����
43  */
44 typedef struct _sk_buffer_tag
45 {
46     TAILQ_ENTRY(_sk_buffer_tag) entry;     // list entry buffer LRU��
47     uint32_t                    last_time; // �ϴ�ʹ��ʱ���
48     uint32_t                    size;      // buffer�ڵ�Ŀռ��С
49     uint8_t*                    head;      // buff������ͷָ��
50     uint8_t*                    end;       // buff����������ָ��
51     uint8_t*                    data;      // ��Ч���ݵ�ͷָ��
52     uint32_t                    data_len;  // ��Ч�����ݳ���
53     uint8_t                     buff[0];   // ԭʼָ������
54 } TSkBuffer;
55 typedef TAILQ_HEAD(__sk_buff_list, _sk_buffer_tag) TSkBuffList;  // multi �����������
56 
57 
58 /**
59  * @brief ����ָ����С��buff��
60  * @param size ��Ч��������С
61  * @return ��NULLΪ�ɹ����ص�buffָ��
62  */
63 TSkBuffer* new_sk_buffer(uint32_t size = SK_DFLT_BUFF_SIZE);
64 
65 /**
66  * @brief �ͷ�ָ����buff��
67  * @param ���ͷŵ�buffָ��
68  */
69 void delete_sk_buffer(TSkBuffer* buff);
70 
71 
72 /**
73  * @brief ������������Ϣ(����Դ�ػ���buff,����չ)
74  * @param buff -���е�buffָ��
75  * @param size -��Ҫ��չ�����ճ��ȴ�С
76  * @return ʵ�ʵ�buff��Ϣ
77  */
78 TSkBuffer* reserve_sk_buffer(TSkBuffer* buff, uint32_t size);
79 
80 
81 /**
82  * @brief  buffer cache ����
83  */
84 typedef struct _sk_buff_mng_tag
85 {
86     TSkBuffList                 free_list;      // buff����
87     uint32_t                    expired;        // ��ʱʱ��
88     uint32_t                    size;           // buff��С
89     uint32_t                    count;          // �����
90 } TSkBuffMng;
91 
92 
93 /**
94  * @brief  cache �صij�ʼ���ӿ�
95  * @param  mng -����ص�ָ��
96  * @param  expired -�����ʱ��, ��λ��
97  * @param  size -�������Ĭ�����ɵĿ��С
98  */
99 void sk_buffer_mng_init(TSkBuffMng* mng, uint32_t expired, uint32_t size = SK_DFLT_BUFF_SIZE);
100 
101 /**
102  * @brief  cache �ص����ٽӿ�
103  * @param  mng -����ص�ָ��
104  */
105 void sk_buffer_mng_destroy(TSkBuffMng * mng);
106 
107 
108 /**
109  * @brief  �������һ��buff
110  * @param  mng -����ص�ָ��
111  * @return ��NULLΪ�ɹ���ȡ��buff��ָ��
112  */
113 TSkBuffer* alloc_sk_buffer(TSkBuffMng* mng);
114 
115 /**
116  * @brief �ͷ�ָ����buff��
117  * @param  mng -����ص�ָ��
118  * @param  buff -���ͷŵ�buffָ��
119  */
120 void free_sk_buffer(TSkBuffMng* mng, TSkBuffer* buff);
121 
122 /**
123  * @brief ���չ��ڵ�buff��
124  * @param  mng -����ص�ָ��
125  * @param  now -��ǰ��ʱ��, �뼶��
126  */
127 void recycle_sk_buffer(TSkBuffMng* mng, uint32_t now);
128 
129 
130 /**
131  * @brief ԭʼ�� buffer cache ����
132  */
133 typedef struct _sk_rw_cache_tag
134 {
135     TSkBuffList                 list;      // buff����
136     uint32_t                    len;       // ���ݳ���
137     uint32_t                    count;     // �����
138     TSkBuffMng                 *pool;      // ȫ��buff��ָ��
139 } TRWCache;
140 
141 
142 /**
143  * @brief Cache��������ʼ��
144  * @param cache -�����ָ��
145  * @param pool -buff��ָ��
146  */
147 void rw_cache_init(TRWCache* cache, TSkBuffMng* pool);
148 
149 /**
150  * @brief Cache����������
151  * @param cache -�����ָ��
152  */
153 void rw_cache_destroy(TRWCache* cache);
154 
155 /**
156  * @brief Cacheɾ����ָ����������
157  * @param cache -�����ָ��
158  * @param len -��ɾ���ij���
159  */
160 void cache_skip_data(TRWCache* cache, uint32_t len);
161 
162 /**
163  * @brief Cache�Ƴ���һ���ڴ�
164  * @param cache -�����ָ��
165  */
166 TSkBuffer* cache_skip_first_buffer(TRWCache* cache);
167 
168 
169 /**
170  * @brief Cache׷��ָ����������
171  * @param cache -�����ָ��
172  * @param data -��׷�ӵ�ָ��
173  * @param len -��׷�ӵij���
174  */
175 int32_t cache_append_data(TRWCache* cache, const void* data, uint32_t len);
176 
177 /**
178  * @brief Cache׷��ָ����������
179  * @param cache -�����ָ��
180  * @param buff -��׷�ӵĿ�ָ��
181  */
182 void cache_append_buffer(TRWCache* cache, TSkBuffer* buff);
183 
184 /**
185  * @brief Cacheɾ��������ָ����������
186  * @param cache -�����ָ��
187  * @param buff -���buff��ָ��
188  * @param len -��ɾ���ij���
189  * @return ʵ�ʿ�������
190  */
191 uint32_t cache_copy_out(TRWCache* cache, void* buff, uint32_t len);
192 
193 
194 /**
195  * @brief Cache���ϵ�UDP�ձ��ӿ�, �����ڴ�Ƚ϶�, ������32λʹ��
196  * @param cache -�����ָ��
197  * @param fd - ׼���ձ���fd���
198  * @param remote_addr -�Զ�ip��ַ
199  * @return ʵ�ʽ��ճ���
200  */
201 int32_t cache_udp_recv(TRWCache* cache, uint32_t fd, struct sockaddr_in* remote_addr);
202 
203 /**
204  * @brief Cache���ϵ�TCP�ձ��ӿ�
205  * @param cache -�����ָ��
206  * @param fd - ׼���ձ���fd���
207  * @return ʵ�ʽ��ճ���
208  */
209 int32_t cache_tcp_recv(TRWCache* cache, uint32_t fd);
210 
211 /**
212  * @brief Cache���ϵ�TCP���ͽӿ�
213  * @param cache -�����ָ��
214  * @param fd - ׼��������fd���
215  * @return ʵ�ʷ��ͳ���
216  */
217 int32_t cache_tcp_send(TRWCache* cache, uint32_t fd);
218 
219 /**
220  * @brief Cache���ϵ�TCP���ͽӿ�, δʹ��IOVEC
221  * @param cache -�����ָ��
222  * @param fd - ׼��������fd���
223  * @param data -������cache��, �������͵�buff
224  * @param len  -�������͵�buff����
225  * @return ʵ�ʷ��ͳ���
226  */
227 int32_t cache_tcp_send_buff(TRWCache* cache, uint32_t fd, const void* data, uint32_t len);
228 
229 
230 
231 
232 
233 // interface
234 typedef void*  TBuffVecPtr;        ///< ���block��cache����ָ����
235 typedef void*  TBuffBlockPtr;      ///< ���������ָ����
236 
237 
238 /**
239  * @brief ��ȡcache��Ч�����ܳ���
240  * @param multi -�����ָ��
241  * @return ʵ����Ч���ݳ���
242  */
243 uint32_t get_data_len(TBuffVecPtr multi);
244 
245 /**
246  * @brief ��ȡcache��Ч���ݿ����
247  * @param multi -�����ָ��
248  * @return ʵ����Ч���ݿ����
249  */
250 uint32_t get_block_count(TBuffVecPtr multi);
251 
252 /**
253  * @brief ��ȡcache�ĵ�һ������ָ��
254  * @param multi -�����ָ��
255  * @return ��һ������ָ��
256  */
257 TBuffBlockPtr get_first_block(TBuffVecPtr multi);
258 
259 /**
260  * @brief ��ȡcache����һ������ָ��
261  * @param multi -�����ָ��
262  * @param block -��ǰ��ָ��
263  * @return ��һ������ָ��
264  */
265 TBuffBlockPtr get_next_block(TBuffVecPtr multi, TBuffBlockPtr block);
266 
267 /**
268  * @brief ��ȡ���ݿ��ָ�������ݳ���
269  * @param block -��ǰ��ָ��
270  * @param data -����ָ��-modify����
271  * @param len  -����ָ�� modify����
272  */
273 void get_block_data(TBuffBlockPtr block, const void** data, int32_t* len);
274 
275 
276 /**
277  * @brief ��ȡ���ݿ��ָ�������ݳ���
278  * @param multi -�����ָ��
279  * @param data -����д������ָ��
280  * @param len  -����
281  * @return ���ݶ�ȡ�����ݳ���
282  */
283 uint32_t read_cache_data(TBuffVecPtr multi, void* data, uint32_t len);
284 
285 
286 /**
287  * @brief ��ȡ���ݿ��ָ�������ݳ���
288  * @param multi -�����ָ��
289  * @param data -����д������ָ��
290  * @param len  -����
291  * @return ���ݶ�ȡ�����ݳ���
292  */
293 uint32_t read_cache_begin(TBuffVecPtr multi, uint32_t begin, void* data, uint32_t len);
294 
295 
296 };
297 
298 #endif
299