xref: /f-stack/app/micro_thread/mt_mbuf_pool.cpp (revision 35a81399)
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