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