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