xref: /f-stack/app/micro_thread/mt_mbuf_pool.h (revision 35a81399)
1a9643ea8Slogwang 
2a9643ea8Slogwang /**
3a9643ea8Slogwang  * Tencent is pleased to support the open source community by making MSEC available.
4a9643ea8Slogwang  *
5a9643ea8Slogwang  * Copyright (C) 2016 THL A29 Limited, a Tencent company. All rights reserved.
6a9643ea8Slogwang  *
7a9643ea8Slogwang  * Licensed under the GNU General Public License, Version 2.0 (the "License");
8a9643ea8Slogwang  * you may not use this file except in compliance with the License. You may
9a9643ea8Slogwang  * obtain a copy of the License at
10a9643ea8Slogwang  *
11a9643ea8Slogwang  *     https://opensource.org/licenses/GPL-2.0
12a9643ea8Slogwang  *
13a9643ea8Slogwang  * Unless required by applicable law or agreed to in writing, software distributed under the
14a9643ea8Slogwang  * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
15a9643ea8Slogwang  * either express or implied. See the License for the specific language governing permissions
16a9643ea8Slogwang  * and limitations under the License.
17a9643ea8Slogwang  */
18a9643ea8Slogwang 
19a9643ea8Slogwang 
20a9643ea8Slogwang /**
21a9643ea8Slogwang  *  @file mt_mbuf_pool.h
22a9643ea8Slogwang  **/
23a9643ea8Slogwang 
24a9643ea8Slogwang #ifndef __MT_MBUF_POOL_H__
25a9643ea8Slogwang #define __MT_MBUF_POOL_H__
26a9643ea8Slogwang 
27a9643ea8Slogwang #include <netinet/in.h>
28a9643ea8Slogwang #include <queue>
29a9643ea8Slogwang #include "hash_list.h"
30a9643ea8Slogwang 
31a9643ea8Slogwang namespace NS_MICRO_THREAD {
32a9643ea8Slogwang 
33a9643ea8Slogwang using std::queue;
34a9643ea8Slogwang 
35a9643ea8Slogwang enum BUFF_TYPE
36a9643ea8Slogwang {
37*35a81399Slogwang     BUFF_UNDEF          =  0,
38*35a81399Slogwang     BUFF_RECV           =  1,
39*35a81399Slogwang     BUFF_SEND           =  2,
40a9643ea8Slogwang };
41a9643ea8Slogwang 
42a9643ea8Slogwang typedef TAILQ_ENTRY(MtMsgBuf) MsgBufLink;
43a9643ea8Slogwang typedef TAILQ_HEAD(__MtbuffTailq, MtMsgBuf) MsgBufQueue;
44a9643ea8Slogwang class MtMsgBuf
45a9643ea8Slogwang {
46a9643ea8Slogwang private:
47*35a81399Slogwang     int   _max_len;
48*35a81399Slogwang     int   _msg_len;
49*35a81399Slogwang     int   _buf_type;
50*35a81399Slogwang     int   _recv_len;
51*35a81399Slogwang     int   _send_len;
52*35a81399Slogwang     void* _msg_buff;
53a9643ea8Slogwang 
54a9643ea8Slogwang public:
55a9643ea8Slogwang 
56a9643ea8Slogwang     MsgBufLink _entry;
57a9643ea8Slogwang 
MtMsgBuf(int max_len)58a9643ea8Slogwang     MtMsgBuf(int max_len) {
59a9643ea8Slogwang         _max_len  = max_len;
60a9643ea8Slogwang         _msg_len  = 0;
61a9643ea8Slogwang         _buf_type = BUFF_UNDEF;
62a9643ea8Slogwang         _recv_len = 0;
63a9643ea8Slogwang         _send_len = 0;
64a9643ea8Slogwang         _msg_buff = malloc(max_len);
65a9643ea8Slogwang     };
66a9643ea8Slogwang 
~MtMsgBuf()67a9643ea8Slogwang     ~MtMsgBuf() {
68a9643ea8Slogwang         if (_msg_buff) {
69a9643ea8Slogwang             free(_msg_buff);
70a9643ea8Slogwang             _msg_buff = NULL;
71a9643ea8Slogwang         }
72a9643ea8Slogwang     };
73a9643ea8Slogwang 
SetBuffType(BUFF_TYPE type)74a9643ea8Slogwang     void SetBuffType(BUFF_TYPE type) {
75a9643ea8Slogwang         _buf_type = (int)type;
76a9643ea8Slogwang     };
GetBuffType()77a9643ea8Slogwang     BUFF_TYPE GetBuffType() {
78a9643ea8Slogwang         return (BUFF_TYPE)_buf_type;
79a9643ea8Slogwang     };
80a9643ea8Slogwang 
Reset()81a9643ea8Slogwang     void Reset() {
82a9643ea8Slogwang         _msg_len  = 0;
83a9643ea8Slogwang         _recv_len = 0;
84a9643ea8Slogwang         _send_len = 0;
85a9643ea8Slogwang         _buf_type = BUFF_UNDEF;
86a9643ea8Slogwang     };
87a9643ea8Slogwang 
SetMsgLen(int msg_len)88a9643ea8Slogwang     void SetMsgLen(int msg_len) {
89a9643ea8Slogwang         _msg_len = msg_len;
90a9643ea8Slogwang     };
GetMsgLen()91a9643ea8Slogwang     int GetMsgLen() {
92a9643ea8Slogwang         return _msg_len;
93a9643ea8Slogwang     };
94a9643ea8Slogwang 
GetMaxLen()95a9643ea8Slogwang     int GetMaxLen() {
96a9643ea8Slogwang         return _max_len;
97a9643ea8Slogwang     };
GetMsgBuff()98a9643ea8Slogwang     void* GetMsgBuff() {
99a9643ea8Slogwang         return _msg_buff;
100a9643ea8Slogwang     };
101a9643ea8Slogwang 
GetHaveSndLen()102a9643ea8Slogwang     int GetHaveSndLen() {
103a9643ea8Slogwang         return _send_len;
104a9643ea8Slogwang     };
SetHaveSndLen(int snd_len)105a9643ea8Slogwang     void SetHaveSndLen(int snd_len) {
106a9643ea8Slogwang         _send_len = snd_len;
107a9643ea8Slogwang     };
108a9643ea8Slogwang 
109*35a81399Slogwang 
GetHaveRcvLen()110a9643ea8Slogwang     int GetHaveRcvLen() {
111a9643ea8Slogwang         return _recv_len;
112a9643ea8Slogwang     };
SetHaveRcvLen(int rcv_len)113a9643ea8Slogwang     void SetHaveRcvLen(int rcv_len) {
114a9643ea8Slogwang         _recv_len = rcv_len;
115a9643ea8Slogwang     };
116a9643ea8Slogwang };
117a9643ea8Slogwang 
118a9643ea8Slogwang class MsgBufMap : public HashKey
119a9643ea8Slogwang {
120a9643ea8Slogwang public:
121a9643ea8Slogwang 
MsgBufMap(int buff_size,int max_free)122a9643ea8Slogwang     MsgBufMap(int buff_size, int max_free) {
123a9643ea8Slogwang         _max_buf_size = buff_size;
124a9643ea8Slogwang         _max_free     = max_free;
125a9643ea8Slogwang         this->SetDataPtr(this);
126a9643ea8Slogwang         _queue_num    = 0;
127a9643ea8Slogwang         TAILQ_INIT(&_msg_queue);
128a9643ea8Slogwang     };
129a9643ea8Slogwang 
MsgBufMap(int buff_size)130a9643ea8Slogwang     explicit MsgBufMap(int buff_size) {
131a9643ea8Slogwang         _max_buf_size = buff_size;
132a9643ea8Slogwang         TAILQ_INIT(&_msg_queue);
133a9643ea8Slogwang     };
134a9643ea8Slogwang 
~MsgBufMap()135a9643ea8Slogwang     ~MsgBufMap() {
136a9643ea8Slogwang         MtMsgBuf* ptr = NULL;
137a9643ea8Slogwang         MtMsgBuf* tmp = NULL;
138a9643ea8Slogwang         TAILQ_FOREACH_SAFE(ptr, &_msg_queue, _entry, tmp)
139a9643ea8Slogwang         {
140a9643ea8Slogwang             TAILQ_REMOVE(&_msg_queue, ptr, _entry);
141a9643ea8Slogwang             delete ptr;
142a9643ea8Slogwang             _queue_num--;
143a9643ea8Slogwang         }
144a9643ea8Slogwang 
145a9643ea8Slogwang         TAILQ_INIT(&_msg_queue);
146a9643ea8Slogwang     };
147a9643ea8Slogwang 
GetMsgBuf()148a9643ea8Slogwang     MtMsgBuf* GetMsgBuf(){
149a9643ea8Slogwang         MtMsgBuf* ptr = NULL;
150a9643ea8Slogwang         if (!TAILQ_EMPTY(&_msg_queue)) {
151a9643ea8Slogwang             ptr = TAILQ_FIRST(&_msg_queue);
152a9643ea8Slogwang             TAILQ_REMOVE(&_msg_queue, ptr, _entry);
153a9643ea8Slogwang             _queue_num--;
154a9643ea8Slogwang         } else {
155a9643ea8Slogwang             ptr = new MtMsgBuf(_max_buf_size);
156a9643ea8Slogwang         }
157a9643ea8Slogwang 
158a9643ea8Slogwang         return ptr;
159a9643ea8Slogwang     };
160a9643ea8Slogwang 
FreeMsgBuf(MtMsgBuf * ptr)161a9643ea8Slogwang     void FreeMsgBuf(MtMsgBuf* ptr){
162a9643ea8Slogwang         if (_queue_num >= _max_free) {
163a9643ea8Slogwang             delete ptr;
164a9643ea8Slogwang         } else {
165a9643ea8Slogwang             ptr->Reset();
166a9643ea8Slogwang             TAILQ_INSERT_TAIL(&_msg_queue, ptr, _entry);
167a9643ea8Slogwang             _queue_num++;
168a9643ea8Slogwang         }
169a9643ea8Slogwang     };
170a9643ea8Slogwang 
HashValue()171a9643ea8Slogwang     virtual uint32_t HashValue(){
172a9643ea8Slogwang         return _max_buf_size;
173a9643ea8Slogwang     };
174a9643ea8Slogwang 
HashCmp(HashKey * rhs)175a9643ea8Slogwang     virtual int HashCmp(HashKey* rhs){
176a9643ea8Slogwang         return this->_max_buf_size - (int)rhs->HashValue();
177a9643ea8Slogwang     };
178a9643ea8Slogwang 
179a9643ea8Slogwang private:
180*35a81399Slogwang     int _max_free;
181*35a81399Slogwang     int _max_buf_size;
182*35a81399Slogwang     int _queue_num;
183*35a81399Slogwang     MsgBufQueue _msg_queue;
184a9643ea8Slogwang };
185a9643ea8Slogwang 
186a9643ea8Slogwang class MsgBuffPool
187a9643ea8Slogwang {
188a9643ea8Slogwang public:
189a9643ea8Slogwang 
190a9643ea8Slogwang     static MsgBuffPool* Instance (void);
191a9643ea8Slogwang 
192a9643ea8Slogwang     static void Destroy(void);
193a9643ea8Slogwang 
SetMaxFreeNum(int max_free)194a9643ea8Slogwang     void SetMaxFreeNum(int max_free) {
195a9643ea8Slogwang         _max_free = max_free;
196a9643ea8Slogwang     };
197a9643ea8Slogwang 
198a9643ea8Slogwang     MtMsgBuf* GetMsgBuf(int max_size);
199a9643ea8Slogwang 
200a9643ea8Slogwang     void FreeMsgBuf(MtMsgBuf* msg_buf);
201a9643ea8Slogwang 
202a9643ea8Slogwang     ~MsgBuffPool();
203a9643ea8Slogwang 
204a9643ea8Slogwang private:
205a9643ea8Slogwang 
206a9643ea8Slogwang     explicit MsgBuffPool(int max_free = 300);
207a9643ea8Slogwang 
208*35a81399Slogwang     static MsgBuffPool * _instance;
209*35a81399Slogwang     int  _max_free;
210*35a81399Slogwang     HashList* _hash_map;
211a9643ea8Slogwang 
212a9643ea8Slogwang };
213a9643ea8Slogwang 
214a9643ea8Slogwang }
215a9643ea8Slogwang 
216a9643ea8Slogwang #endif
217a9643ea8Slogwang 
218a9643ea8Slogwang 
219