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