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