xref: /f-stack/app/micro_thread/mt_cache.h (revision 35a81399)
1a9643ea8Slogwang 
2a9643ea8Slogwang /**
3a9643ea8Slogwang  * Tencent is pleased to support the open source community by making MSEC available.
4a9643ea8Slogwang  *
5a9643ea8Slogwang  * Copyright (C) 2016 THL A29 Limited, a Tencent company. All rights reserved.
6a9643ea8Slogwang  *
7a9643ea8Slogwang  * Licensed under the GNU General Public License, Version 2.0 (the "License");
8a9643ea8Slogwang  * you may not use this file except in compliance with the License. You may
9a9643ea8Slogwang  * obtain a copy of the License at
10a9643ea8Slogwang  *
11a9643ea8Slogwang  *     https://opensource.org/licenses/GPL-2.0
12a9643ea8Slogwang  *
13a9643ea8Slogwang  * Unless required by applicable law or agreed to in writing, software distributed under the
14a9643ea8Slogwang  * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
15a9643ea8Slogwang  * either express or implied. See the License for the specific language governing permissions
16a9643ea8Slogwang  * and limitations under the License.
17a9643ea8Slogwang  */
18a9643ea8Slogwang 
19a9643ea8Slogwang 
20a9643ea8Slogwang /**
21a9643ea8Slogwang  *  @filename mt_cache.h
22a9643ea8Slogwang  */
23a9643ea8Slogwang 
24a9643ea8Slogwang #ifndef ___MT_BUFFER_CACHE_H
25a9643ea8Slogwang #define ___MT_BUFFER_CACHE_H
26a9643ea8Slogwang 
27a9643ea8Slogwang #include <stdint.h>
28a9643ea8Slogwang #include <sys/queue.h>
29a9643ea8Slogwang 
30a9643ea8Slogwang 
31a9643ea8Slogwang namespace NS_MICRO_THREAD {
32a9643ea8Slogwang 
33a9643ea8Slogwang #define SK_DFLT_BUFF_SIZE   64*1024
34a9643ea8Slogwang #define SK_DFLT_ALIGN_SIZE  8
35a9643ea8Slogwang 
36a9643ea8Slogwang #define SK_ERR_NEED_CLOSE   10000
37a9643ea8Slogwang 
38*35a81399Slogwang 
39a9643ea8Slogwang typedef struct _sk_buffer_tag
40a9643ea8Slogwang {
41*35a81399Slogwang     TAILQ_ENTRY(_sk_buffer_tag) entry;
42*35a81399Slogwang     uint32_t                    last_time;
43*35a81399Slogwang     uint32_t                    size;
44*35a81399Slogwang     uint8_t*                    head;
45*35a81399Slogwang     uint8_t*                    end;
46*35a81399Slogwang     uint8_t*                    data;
47*35a81399Slogwang     uint32_t                    data_len;
48*35a81399Slogwang     uint8_t                     buff[0];
49a9643ea8Slogwang } TSkBuffer;
50*35a81399Slogwang typedef TAILQ_HEAD(__sk_buff_list, _sk_buffer_tag) TSkBuffList;
51a9643ea8Slogwang 
52a9643ea8Slogwang 
53a9643ea8Slogwang TSkBuffer* new_sk_buffer(uint32_t size = SK_DFLT_BUFF_SIZE);
54a9643ea8Slogwang 
55a9643ea8Slogwang void delete_sk_buffer(TSkBuffer* buff);
56a9643ea8Slogwang 
57a9643ea8Slogwang TSkBuffer* reserve_sk_buffer(TSkBuffer* buff, uint32_t size);
58a9643ea8Slogwang 
59a9643ea8Slogwang typedef struct _sk_buff_mng_tag
60a9643ea8Slogwang {
61*35a81399Slogwang     TSkBuffList                 free_list;
62*35a81399Slogwang     uint32_t                    expired;
63*35a81399Slogwang     uint32_t                    size;
64*35a81399Slogwang     uint32_t                    count;
65a9643ea8Slogwang } TSkBuffMng;
66a9643ea8Slogwang 
67a9643ea8Slogwang void sk_buffer_mng_init(TSkBuffMng* mng, uint32_t expired, uint32_t size = SK_DFLT_BUFF_SIZE);
68a9643ea8Slogwang 
69a9643ea8Slogwang void sk_buffer_mng_destroy(TSkBuffMng * mng);
70a9643ea8Slogwang 
71a9643ea8Slogwang TSkBuffer* alloc_sk_buffer(TSkBuffMng* mng);
72a9643ea8Slogwang 
73a9643ea8Slogwang void free_sk_buffer(TSkBuffMng* mng, TSkBuffer* buff);
74a9643ea8Slogwang 
75a9643ea8Slogwang void recycle_sk_buffer(TSkBuffMng* mng, uint32_t now);
76a9643ea8Slogwang 
77a9643ea8Slogwang typedef struct _sk_rw_cache_tag
78a9643ea8Slogwang {
79*35a81399Slogwang     TSkBuffList                 list;
80*35a81399Slogwang     uint32_t                    len;
81*35a81399Slogwang     uint32_t                    count;
82*35a81399Slogwang     TSkBuffMng                 *pool;
83a9643ea8Slogwang } TRWCache;
84a9643ea8Slogwang 
85a9643ea8Slogwang void rw_cache_init(TRWCache* cache, TSkBuffMng* pool);
86a9643ea8Slogwang 
87a9643ea8Slogwang void rw_cache_destroy(TRWCache* cache);
88a9643ea8Slogwang 
89a9643ea8Slogwang void cache_skip_data(TRWCache* cache, uint32_t len);
90a9643ea8Slogwang 
91a9643ea8Slogwang TSkBuffer* cache_skip_first_buffer(TRWCache* cache);
92a9643ea8Slogwang 
93a9643ea8Slogwang int32_t cache_append_data(TRWCache* cache, const void* data, uint32_t len);
94a9643ea8Slogwang 
95a9643ea8Slogwang void cache_append_buffer(TRWCache* cache, TSkBuffer* buff);
96a9643ea8Slogwang 
97a9643ea8Slogwang uint32_t cache_copy_out(TRWCache* cache, void* buff, uint32_t len);
98a9643ea8Slogwang 
99a9643ea8Slogwang int32_t cache_udp_recv(TRWCache* cache, uint32_t fd, struct sockaddr_in* remote_addr);
100a9643ea8Slogwang 
101a9643ea8Slogwang int32_t cache_tcp_recv(TRWCache* cache, uint32_t fd);
102a9643ea8Slogwang 
103a9643ea8Slogwang int32_t cache_tcp_send(TRWCache* cache, uint32_t fd);
104a9643ea8Slogwang 
105a9643ea8Slogwang int32_t cache_tcp_send_buff(TRWCache* cache, uint32_t fd, const void* data, uint32_t len);
106a9643ea8Slogwang 
107a9643ea8Slogwang 
108a9643ea8Slogwang // interface
109*35a81399Slogwang typedef void*  TBuffVecPtr;
110*35a81399Slogwang typedef void*  TBuffBlockPtr;
111a9643ea8Slogwang 
112a9643ea8Slogwang uint32_t get_data_len(TBuffVecPtr multi);
113a9643ea8Slogwang 
114a9643ea8Slogwang uint32_t get_block_count(TBuffVecPtr multi);
115a9643ea8Slogwang 
116a9643ea8Slogwang TBuffBlockPtr get_first_block(TBuffVecPtr multi);
117a9643ea8Slogwang 
118a9643ea8Slogwang TBuffBlockPtr get_next_block(TBuffVecPtr multi, TBuffBlockPtr block);
119a9643ea8Slogwang 
120a9643ea8Slogwang void get_block_data(TBuffBlockPtr block, const void** data, int32_t* len);
121a9643ea8Slogwang 
122a9643ea8Slogwang uint32_t read_cache_data(TBuffVecPtr multi, void* data, uint32_t len);
123a9643ea8Slogwang 
124a9643ea8Slogwang uint32_t read_cache_begin(TBuffVecPtr multi, uint32_t begin, void* data, uint32_t len);
125a9643ea8Slogwang 
126a9643ea8Slogwang };
127a9643ea8Slogwang 
128a9643ea8Slogwang #endif
129