1
2 /**
3 * Tencent is pleased to support the open source community by making MSEC available.
4 *
5 * Copyright (C) 2016 THL A29 Limited, a Tencent company. All rights reserved.
6 *
7 * Licensed under the GNU General Public License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License. You may
9 * obtain a copy of the License at
10 *
11 * https://opensource.org/licenses/GPL-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software distributed under the
14 * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
15 * either express or implied. See the License for the specific language governing permissions
16 * and limitations under the License.
17 */
18
19
20 /**
21 * @file mt_mbuf_pool.cpp
22 * @time 20130924
23 **/
24
25 #include "micro_thread.h"
26 #include "mt_mbuf_pool.h"
27
28 using namespace std;
29 using namespace NS_MICRO_THREAD;
30
31 MsgBuffPool* MsgBuffPool::_instance = NULL;
Instance(void)32 MsgBuffPool* MsgBuffPool::Instance (void)
33 {
34 if (NULL == _instance)
35 {
36 _instance = new MsgBuffPool;
37 }
38
39 return _instance;
40 }
41
Destroy()42 void MsgBuffPool::Destroy()
43 {
44 if( _instance != NULL )
45 {
46 delete _instance;
47 _instance = NULL;
48 }
49 }
50
MsgBuffPool(int max_free)51 MsgBuffPool::MsgBuffPool(int max_free)
52 {
53 _max_free = max_free;
54 _hash_map = new HashList(10000);
55 }
56
~MsgBuffPool()57 MsgBuffPool::~MsgBuffPool()
58 {
59 if (!_hash_map) {
60 return;
61 }
62
63 MsgBufMap* msg_map = NULL;
64 HashKey* hash_item = _hash_map->HashGetFirst();
65 while (hash_item)
66 {
67 _hash_map->HashRemove(hash_item);
68 msg_map = dynamic_cast<MsgBufMap*>(hash_item);
69 delete msg_map;
70
71 hash_item = _hash_map->HashGetFirst();
72 }
73
74 delete _hash_map;
75 _hash_map = NULL;
76 }
77
GetMsgBuf(int max_size)78 MtMsgBuf* MsgBuffPool::GetMsgBuf(int max_size)
79 {
80 if (!_hash_map) {
81 MTLOG_ERROR("MsgBuffPoll not init! hash %p,", _hash_map);
82 return NULL;
83 }
84
85 MsgBufMap* msg_map = NULL;
86 MsgBufMap msg_key(max_size);
87 HashKey* hash_item = _hash_map->HashFind(&msg_key);
88 if (hash_item) {
89 msg_map = (MsgBufMap*)hash_item->GetDataPtr();
90 if (msg_map) {
91 return msg_map->GetMsgBuf();
92 } else {
93 MTLOG_ERROR("Hash item: %p, msg_map: %p impossible, clean it", hash_item, msg_map);
94 _hash_map->HashRemove(hash_item);
95 delete hash_item;
96 return NULL;
97 }
98 } else {
99 msg_map = new MsgBufMap(max_size, _max_free);
100 if (!msg_map) {
101 MTLOG_ERROR("maybe no more memory, failed. size: %d", max_size);
102 return NULL;
103 }
104 _hash_map->HashInsert(msg_map);
105
106 return msg_map->GetMsgBuf();
107 }
108 }
109
FreeMsgBuf(MtMsgBuf * msg_buf)110 void MsgBuffPool::FreeMsgBuf(MtMsgBuf* msg_buf)
111 {
112 if (!_hash_map || !msg_buf) {
113 MTLOG_ERROR("MsgBuffPoll not init or input error! hash %p, msg_buf %p", _hash_map, msg_buf);
114 delete msg_buf;
115 return;
116 }
117 msg_buf->Reset();
118
119 MsgBufMap* msg_map = NULL;
120 MsgBufMap msg_key(msg_buf->GetMaxLen());
121 HashKey* hash_item = _hash_map->HashFind(&msg_key);
122 if (hash_item) {
123 msg_map = (MsgBufMap*)hash_item->GetDataPtr();
124 }
125 if (!hash_item || !msg_map) {
126 MTLOG_ERROR("MsgBuffPoll find no queue, maybe error: %d", msg_buf->GetMaxLen());
127 delete msg_buf;
128 return;
129 }
130 msg_map->FreeMsgBuf(msg_buf);
131
132 return;
133 }
134
135
136