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 * @file mt_mbuf_pool.cpp 22*a9643ea8Slogwang * @info �߳���Ϣbuf�ع���ʵ�� 23*a9643ea8Slogwang * @time 20130924 24*a9643ea8Slogwang **/ 25*a9643ea8Slogwang 26*a9643ea8Slogwang #include "micro_thread.h" 27*a9643ea8Slogwang #include "mt_mbuf_pool.h" 28*a9643ea8Slogwang 29*a9643ea8Slogwang using namespace std; 30*a9643ea8Slogwang using namespace NS_MICRO_THREAD; 31*a9643ea8Slogwang 32*a9643ea8Slogwang 33*a9643ea8Slogwang /** 34*a9643ea8Slogwang * @brief ���ӹ���ȫ�ַ��ʽӿ� 35*a9643ea8Slogwang * @return ȫ�־��ָ�� 36*a9643ea8Slogwang */ 37*a9643ea8Slogwang MsgBuffPool* MsgBuffPool::_instance = NULL; 38*a9643ea8Slogwang MsgBuffPool* MsgBuffPool::Instance (void) 39*a9643ea8Slogwang { 40*a9643ea8Slogwang if (NULL == _instance) 41*a9643ea8Slogwang { 42*a9643ea8Slogwang _instance = new MsgBuffPool; 43*a9643ea8Slogwang } 44*a9643ea8Slogwang 45*a9643ea8Slogwang return _instance; 46*a9643ea8Slogwang } 47*a9643ea8Slogwang 48*a9643ea8Slogwang /** 49*a9643ea8Slogwang * @brief ���ӹ���ȫ�ֵ����ٽӿ� 50*a9643ea8Slogwang */ 51*a9643ea8Slogwang void MsgBuffPool::Destroy() 52*a9643ea8Slogwang { 53*a9643ea8Slogwang if( _instance != NULL ) 54*a9643ea8Slogwang { 55*a9643ea8Slogwang delete _instance; 56*a9643ea8Slogwang _instance = NULL; 57*a9643ea8Slogwang } 58*a9643ea8Slogwang } 59*a9643ea8Slogwang 60*a9643ea8Slogwang 61*a9643ea8Slogwang /** 62*a9643ea8Slogwang * @brief ��Ϣbuff�Ĺ��캯�� 63*a9643ea8Slogwang */ 64*a9643ea8Slogwang MsgBuffPool::MsgBuffPool(int max_free) 65*a9643ea8Slogwang { 66*a9643ea8Slogwang _max_free = max_free; 67*a9643ea8Slogwang _hash_map = new HashList(10000); 68*a9643ea8Slogwang } 69*a9643ea8Slogwang 70*a9643ea8Slogwang /** 71*a9643ea8Slogwang * @brief ��Ϣbuff���������� 72*a9643ea8Slogwang */ 73*a9643ea8Slogwang MsgBuffPool::~MsgBuffPool() 74*a9643ea8Slogwang { 75*a9643ea8Slogwang if (!_hash_map) { 76*a9643ea8Slogwang return; 77*a9643ea8Slogwang } 78*a9643ea8Slogwang 79*a9643ea8Slogwang MsgBufMap* msg_map = NULL; 80*a9643ea8Slogwang HashKey* hash_item = _hash_map->HashGetFirst(); 81*a9643ea8Slogwang while (hash_item) 82*a9643ea8Slogwang { 83*a9643ea8Slogwang _hash_map->HashRemove(hash_item); 84*a9643ea8Slogwang msg_map = dynamic_cast<MsgBufMap*>(hash_item); 85*a9643ea8Slogwang delete msg_map; 86*a9643ea8Slogwang 87*a9643ea8Slogwang hash_item = _hash_map->HashGetFirst(); 88*a9643ea8Slogwang } 89*a9643ea8Slogwang 90*a9643ea8Slogwang delete _hash_map; 91*a9643ea8Slogwang _hash_map = NULL; 92*a9643ea8Slogwang } 93*a9643ea8Slogwang 94*a9643ea8Slogwang /** 95*a9643ea8Slogwang * @brief ��ȡ��ϢbuffԪ�� 96*a9643ea8Slogwang * @return msgbufָ��, ʧ��ΪNULL 97*a9643ea8Slogwang */ 98*a9643ea8Slogwang MtMsgBuf* MsgBuffPool::GetMsgBuf(int max_size) 99*a9643ea8Slogwang { 100*a9643ea8Slogwang if (!_hash_map) { 101*a9643ea8Slogwang MTLOG_ERROR("MsgBuffPoll not init! hash %p,", _hash_map); 102*a9643ea8Slogwang return NULL; 103*a9643ea8Slogwang } 104*a9643ea8Slogwang 105*a9643ea8Slogwang MsgBufMap* msg_map = NULL; 106*a9643ea8Slogwang MsgBufMap msg_key(max_size); 107*a9643ea8Slogwang HashKey* hash_item = _hash_map->HashFind(&msg_key); 108*a9643ea8Slogwang if (hash_item) { 109*a9643ea8Slogwang msg_map = (MsgBufMap*)hash_item->GetDataPtr(); 110*a9643ea8Slogwang if (msg_map) { 111*a9643ea8Slogwang return msg_map->GetMsgBuf(); 112*a9643ea8Slogwang } else { 113*a9643ea8Slogwang MTLOG_ERROR("Hash item: %p, msg_map: %p impossible, clean it", hash_item, msg_map); 114*a9643ea8Slogwang _hash_map->HashRemove(hash_item); 115*a9643ea8Slogwang delete hash_item; 116*a9643ea8Slogwang return NULL; 117*a9643ea8Slogwang } 118*a9643ea8Slogwang } else { 119*a9643ea8Slogwang msg_map = new MsgBufMap(max_size, _max_free); 120*a9643ea8Slogwang if (!msg_map) { 121*a9643ea8Slogwang MTLOG_ERROR("maybe no more memory, failed. size: %d", max_size); 122*a9643ea8Slogwang return NULL; 123*a9643ea8Slogwang } 124*a9643ea8Slogwang _hash_map->HashInsert(msg_map); 125*a9643ea8Slogwang 126*a9643ea8Slogwang return msg_map->GetMsgBuf(); 127*a9643ea8Slogwang } 128*a9643ea8Slogwang } 129*a9643ea8Slogwang 130*a9643ea8Slogwang /** 131*a9643ea8Slogwang * @brief ��ȡ��ϢbuffԪ�� 132*a9643ea8Slogwang * @return msgbufָ��, ʧ��ΪNULL 133*a9643ea8Slogwang */ 134*a9643ea8Slogwang void MsgBuffPool::FreeMsgBuf(MtMsgBuf* msg_buf) 135*a9643ea8Slogwang { 136*a9643ea8Slogwang if (!_hash_map || !msg_buf) { 137*a9643ea8Slogwang MTLOG_ERROR("MsgBuffPoll not init or input error! hash %p, msg_buf %p", _hash_map, msg_buf); 138*a9643ea8Slogwang delete msg_buf; 139*a9643ea8Slogwang return; 140*a9643ea8Slogwang } 141*a9643ea8Slogwang msg_buf->Reset(); 142*a9643ea8Slogwang 143*a9643ea8Slogwang MsgBufMap* msg_map = NULL; 144*a9643ea8Slogwang MsgBufMap msg_key(msg_buf->GetMaxLen()); 145*a9643ea8Slogwang HashKey* hash_item = _hash_map->HashFind(&msg_key); 146*a9643ea8Slogwang if (hash_item) { 147*a9643ea8Slogwang msg_map = (MsgBufMap*)hash_item->GetDataPtr(); 148*a9643ea8Slogwang } 149*a9643ea8Slogwang if (!hash_item || !msg_map) { 150*a9643ea8Slogwang MTLOG_ERROR("MsgBuffPoll find no queue, maybe error: %d", msg_buf->GetMaxLen()); 151*a9643ea8Slogwang delete msg_buf; 152*a9643ea8Slogwang return; 153*a9643ea8Slogwang } 154*a9643ea8Slogwang msg_map->FreeMsgBuf(msg_buf); 155*a9643ea8Slogwang 156*a9643ea8Slogwang return; 157*a9643ea8Slogwang } 158*a9643ea8Slogwang 159*a9643ea8Slogwang 160