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 * @file mt_mbuf_pool.h 22a9643ea8Slogwang **/ 23a9643ea8Slogwang 24a9643ea8Slogwang #ifndef __MT_MBUF_POOL_H__ 25a9643ea8Slogwang #define __MT_MBUF_POOL_H__ 26a9643ea8Slogwang 27a9643ea8Slogwang #include <netinet/in.h> 28a9643ea8Slogwang #include <queue> 29a9643ea8Slogwang #include "hash_list.h" 30a9643ea8Slogwang 31a9643ea8Slogwang namespace NS_MICRO_THREAD { 32a9643ea8Slogwang 33a9643ea8Slogwang using std::queue; 34a9643ea8Slogwang 35a9643ea8Slogwang enum BUFF_TYPE 36a9643ea8Slogwang { 37*35a81399Slogwang BUFF_UNDEF = 0, 38*35a81399Slogwang BUFF_RECV = 1, 39*35a81399Slogwang BUFF_SEND = 2, 40a9643ea8Slogwang }; 41a9643ea8Slogwang 42a9643ea8Slogwang typedef TAILQ_ENTRY(MtMsgBuf) MsgBufLink; 43a9643ea8Slogwang typedef TAILQ_HEAD(__MtbuffTailq, MtMsgBuf) MsgBufQueue; 44a9643ea8Slogwang class MtMsgBuf 45a9643ea8Slogwang { 46a9643ea8Slogwang private: 47*35a81399Slogwang int _max_len; 48*35a81399Slogwang int _msg_len; 49*35a81399Slogwang int _buf_type; 50*35a81399Slogwang int _recv_len; 51*35a81399Slogwang int _send_len; 52*35a81399Slogwang void* _msg_buff; 53a9643ea8Slogwang 54a9643ea8Slogwang public: 55a9643ea8Slogwang 56a9643ea8Slogwang MsgBufLink _entry; 57a9643ea8Slogwang MtMsgBuf(int max_len)58a9643ea8Slogwang MtMsgBuf(int max_len) { 59a9643ea8Slogwang _max_len = max_len; 60a9643ea8Slogwang _msg_len = 0; 61a9643ea8Slogwang _buf_type = BUFF_UNDEF; 62a9643ea8Slogwang _recv_len = 0; 63a9643ea8Slogwang _send_len = 0; 64a9643ea8Slogwang _msg_buff = malloc(max_len); 65a9643ea8Slogwang }; 66a9643ea8Slogwang ~MtMsgBuf()67a9643ea8Slogwang ~MtMsgBuf() { 68a9643ea8Slogwang if (_msg_buff) { 69a9643ea8Slogwang free(_msg_buff); 70a9643ea8Slogwang _msg_buff = NULL; 71a9643ea8Slogwang } 72a9643ea8Slogwang }; 73a9643ea8Slogwang SetBuffType(BUFF_TYPE type)74a9643ea8Slogwang void SetBuffType(BUFF_TYPE type) { 75a9643ea8Slogwang _buf_type = (int)type; 76a9643ea8Slogwang }; GetBuffType()77a9643ea8Slogwang BUFF_TYPE GetBuffType() { 78a9643ea8Slogwang return (BUFF_TYPE)_buf_type; 79a9643ea8Slogwang }; 80a9643ea8Slogwang Reset()81a9643ea8Slogwang void Reset() { 82a9643ea8Slogwang _msg_len = 0; 83a9643ea8Slogwang _recv_len = 0; 84a9643ea8Slogwang _send_len = 0; 85a9643ea8Slogwang _buf_type = BUFF_UNDEF; 86a9643ea8Slogwang }; 87a9643ea8Slogwang SetMsgLen(int msg_len)88a9643ea8Slogwang void SetMsgLen(int msg_len) { 89a9643ea8Slogwang _msg_len = msg_len; 90a9643ea8Slogwang }; GetMsgLen()91a9643ea8Slogwang int GetMsgLen() { 92a9643ea8Slogwang return _msg_len; 93a9643ea8Slogwang }; 94a9643ea8Slogwang GetMaxLen()95a9643ea8Slogwang int GetMaxLen() { 96a9643ea8Slogwang return _max_len; 97a9643ea8Slogwang }; GetMsgBuff()98a9643ea8Slogwang void* GetMsgBuff() { 99a9643ea8Slogwang return _msg_buff; 100a9643ea8Slogwang }; 101a9643ea8Slogwang GetHaveSndLen()102a9643ea8Slogwang int GetHaveSndLen() { 103a9643ea8Slogwang return _send_len; 104a9643ea8Slogwang }; SetHaveSndLen(int snd_len)105a9643ea8Slogwang void SetHaveSndLen(int snd_len) { 106a9643ea8Slogwang _send_len = snd_len; 107a9643ea8Slogwang }; 108a9643ea8Slogwang 109*35a81399Slogwang GetHaveRcvLen()110a9643ea8Slogwang int GetHaveRcvLen() { 111a9643ea8Slogwang return _recv_len; 112a9643ea8Slogwang }; SetHaveRcvLen(int rcv_len)113a9643ea8Slogwang void SetHaveRcvLen(int rcv_len) { 114a9643ea8Slogwang _recv_len = rcv_len; 115a9643ea8Slogwang }; 116a9643ea8Slogwang }; 117a9643ea8Slogwang 118a9643ea8Slogwang class MsgBufMap : public HashKey 119a9643ea8Slogwang { 120a9643ea8Slogwang public: 121a9643ea8Slogwang MsgBufMap(int buff_size,int max_free)122a9643ea8Slogwang MsgBufMap(int buff_size, int max_free) { 123a9643ea8Slogwang _max_buf_size = buff_size; 124a9643ea8Slogwang _max_free = max_free; 125a9643ea8Slogwang this->SetDataPtr(this); 126a9643ea8Slogwang _queue_num = 0; 127a9643ea8Slogwang TAILQ_INIT(&_msg_queue); 128a9643ea8Slogwang }; 129a9643ea8Slogwang MsgBufMap(int buff_size)130a9643ea8Slogwang explicit MsgBufMap(int buff_size) { 131a9643ea8Slogwang _max_buf_size = buff_size; 132a9643ea8Slogwang TAILQ_INIT(&_msg_queue); 133a9643ea8Slogwang }; 134a9643ea8Slogwang ~MsgBufMap()135a9643ea8Slogwang ~MsgBufMap() { 136a9643ea8Slogwang MtMsgBuf* ptr = NULL; 137a9643ea8Slogwang MtMsgBuf* tmp = NULL; 138a9643ea8Slogwang TAILQ_FOREACH_SAFE(ptr, &_msg_queue, _entry, tmp) 139a9643ea8Slogwang { 140a9643ea8Slogwang TAILQ_REMOVE(&_msg_queue, ptr, _entry); 141a9643ea8Slogwang delete ptr; 142a9643ea8Slogwang _queue_num--; 143a9643ea8Slogwang } 144a9643ea8Slogwang 145a9643ea8Slogwang TAILQ_INIT(&_msg_queue); 146a9643ea8Slogwang }; 147a9643ea8Slogwang GetMsgBuf()148a9643ea8Slogwang MtMsgBuf* GetMsgBuf(){ 149a9643ea8Slogwang MtMsgBuf* ptr = NULL; 150a9643ea8Slogwang if (!TAILQ_EMPTY(&_msg_queue)) { 151a9643ea8Slogwang ptr = TAILQ_FIRST(&_msg_queue); 152a9643ea8Slogwang TAILQ_REMOVE(&_msg_queue, ptr, _entry); 153a9643ea8Slogwang _queue_num--; 154a9643ea8Slogwang } else { 155a9643ea8Slogwang ptr = new MtMsgBuf(_max_buf_size); 156a9643ea8Slogwang } 157a9643ea8Slogwang 158a9643ea8Slogwang return ptr; 159a9643ea8Slogwang }; 160a9643ea8Slogwang FreeMsgBuf(MtMsgBuf * ptr)161a9643ea8Slogwang void FreeMsgBuf(MtMsgBuf* ptr){ 162a9643ea8Slogwang if (_queue_num >= _max_free) { 163a9643ea8Slogwang delete ptr; 164a9643ea8Slogwang } else { 165a9643ea8Slogwang ptr->Reset(); 166a9643ea8Slogwang TAILQ_INSERT_TAIL(&_msg_queue, ptr, _entry); 167a9643ea8Slogwang _queue_num++; 168a9643ea8Slogwang } 169a9643ea8Slogwang }; 170a9643ea8Slogwang HashValue()171a9643ea8Slogwang virtual uint32_t HashValue(){ 172a9643ea8Slogwang return _max_buf_size; 173a9643ea8Slogwang }; 174a9643ea8Slogwang HashCmp(HashKey * rhs)175a9643ea8Slogwang virtual int HashCmp(HashKey* rhs){ 176a9643ea8Slogwang return this->_max_buf_size - (int)rhs->HashValue(); 177a9643ea8Slogwang }; 178a9643ea8Slogwang 179a9643ea8Slogwang private: 180*35a81399Slogwang int _max_free; 181*35a81399Slogwang int _max_buf_size; 182*35a81399Slogwang int _queue_num; 183*35a81399Slogwang MsgBufQueue _msg_queue; 184a9643ea8Slogwang }; 185a9643ea8Slogwang 186a9643ea8Slogwang class MsgBuffPool 187a9643ea8Slogwang { 188a9643ea8Slogwang public: 189a9643ea8Slogwang 190a9643ea8Slogwang static MsgBuffPool* Instance (void); 191a9643ea8Slogwang 192a9643ea8Slogwang static void Destroy(void); 193a9643ea8Slogwang SetMaxFreeNum(int max_free)194a9643ea8Slogwang void SetMaxFreeNum(int max_free) { 195a9643ea8Slogwang _max_free = max_free; 196a9643ea8Slogwang }; 197a9643ea8Slogwang 198a9643ea8Slogwang MtMsgBuf* GetMsgBuf(int max_size); 199a9643ea8Slogwang 200a9643ea8Slogwang void FreeMsgBuf(MtMsgBuf* msg_buf); 201a9643ea8Slogwang 202a9643ea8Slogwang ~MsgBuffPool(); 203a9643ea8Slogwang 204a9643ea8Slogwang private: 205a9643ea8Slogwang 206a9643ea8Slogwang explicit MsgBuffPool(int max_free = 300); 207a9643ea8Slogwang 208*35a81399Slogwang static MsgBuffPool * _instance; 209*35a81399Slogwang int _max_free; 210*35a81399Slogwang HashList* _hash_map; 211a9643ea8Slogwang 212a9643ea8Slogwang }; 213a9643ea8Slogwang 214a9643ea8Slogwang } 215a9643ea8Slogwang 216a9643ea8Slogwang #endif 217a9643ea8Slogwang 218a9643ea8Slogwang 219