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