Skip to content

Commit 43f9ca4

Browse files
authored
Merge pull request #38 from jay602/master
插件发送消息可能泄露 #998
2 parents d43e09c + 18c72bf commit 43f9ca4

File tree

4 files changed

+89
-17
lines changed

4 files changed

+89
-17
lines changed

Plugins/kbengine_ue4_plugins/Source/KBEnginePlugins/Engine/Bundle.cpp

Lines changed: 40 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
#include "Messages.h"
55
#include "NetworkInterfaceBase.h"
66
#include "KBDebug.h"
7+
#include "ObjectPool.h"
8+
9+
static ObjectPool<Bundle> _g_bundlePool;
710

811
Bundle::Bundle():
912
pCurrPacket_(NULL),
@@ -18,18 +21,29 @@ Bundle::Bundle():
1821

1922
Bundle::~Bundle()
2023
{
21-
MemoryStream::reclaimObject(pCurrPacket_);
22-
pCurrPacket_ = NULL;
24+
if (pCurrPacket_)
25+
{
26+
delete pCurrPacket_;
27+
pCurrPacket_ = NULL;
28+
}
29+
30+
for (int i = 0; i < streams_.Num(); ++i)
31+
{
32+
delete streams_[i];
33+
}
34+
35+
streams_.Empty();
2336
}
2437

2538
Bundle* Bundle::createObject()
2639
{
27-
return new Bundle();
40+
return _g_bundlePool.createObject();
2841
}
2942

3043
void Bundle::reclaimObject(Bundle* obj)
3144
{
32-
delete obj;
45+
obj->clear();
46+
_g_bundlePool.reclaimObject(obj);
3347
}
3448

3549
void Bundle::newMessage(Message* pMsg)
@@ -87,17 +101,6 @@ void Bundle::send(NetworkInterfaceBase* pNetworkInterface)
87101
ERROR_MSG("Bundle::send(): networkInterface invalid!");
88102
}
89103

90-
// 把不用的MemoryStream放回缓冲池,以减少垃圾回收的消耗
91-
for (int i = 0; i < streams_.Num(); ++i)
92-
{
93-
MemoryStream::reclaimObject(streams_[i]);
94-
}
95-
96-
streams_.Empty();
97-
98-
if(pCurrPacket_)
99-
pCurrPacket_->clear(true);
100-
101104
// 我们认为,发送完成,就视为这个bundle不再使用了,
102105
// 所以我们会把它放回对象池,以减少垃圾回收带来的消耗,
103106
// 如果需要继续使用,应该重新Bundle.createObject(),
@@ -135,6 +138,28 @@ void Bundle::checkStream(uint32 v)
135138
messageLength_ += v;
136139
}
137140

141+
void Bundle::clear()
142+
{
143+
// 把不用的MemoryStream放回缓冲池,以减少垃圾回收的消耗
144+
for (int i = 0; i < streams_.Num(); ++i)
145+
{
146+
if(pCurrPacket_ != streams_[i])
147+
MemoryStream::reclaimObject(streams_[i]);
148+
}
149+
150+
streams_.Empty();
151+
152+
if (pCurrPacket_)
153+
pCurrPacket_->clear(false);
154+
else
155+
pCurrPacket_ = MemoryStream::createObject();
156+
157+
numMessage_ = 0;
158+
messageLength_ = 0;
159+
pMsgtype_ = NULL;
160+
curMsgStreamIndex_ = 0;
161+
}
162+
138163
Bundle &Bundle::operator<<(uint8 value)
139164
{
140165
checkStream(sizeof(uint8));

Plugins/kbengine_ue4_plugins/Source/KBEnginePlugins/Engine/Bundle.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ class KBENGINEPLUGINS_API Bundle
3131

3232
void checkStream(uint32 v);
3333

34+
void clear();
35+
3436
public:
3537
Bundle &operator<<(uint8 value);
3638
Bundle &operator<<(uint16 value);

Plugins/kbengine_ue4_plugins/Source/KBEnginePlugins/Engine/MemoryStream.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,19 @@
11

22
#include "MemoryStream.h"
33
#include "KBDebug.h"
4+
#include "ObjectPool.h"
5+
6+
static ObjectPool<MemoryStream> _g_memoryStreamPool;
47

58
MemoryStream* MemoryStream::createObject()
69
{
7-
return new MemoryStream();
10+
return _g_memoryStreamPool.createObject();
811
}
912

1013
void MemoryStream::reclaimObject(MemoryStream* obj)
1114
{
12-
delete obj;
15+
obj->clear(false);
16+
_g_memoryStreamPool.reclaimObject(obj);
1317
}
1418

1519
void MemoryStream::print_storage()
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
#pragma once
2+
3+
template<typename T>
4+
class ObjectPool
5+
{
6+
public:
7+
~ObjectPool()
8+
{
9+
while (objects_.Num() > 0)
10+
{
11+
TDoubleLinkedList< T* >::TDoubleLinkedListNode* node = objects_.GetHead();
12+
T* t = node->GetValue();
13+
delete t;
14+
objects_.RemoveNode(node);
15+
}
16+
}
17+
18+
T* createObject()
19+
{
20+
if (objects_.Num() > 0)
21+
{
22+
TDoubleLinkedList< T* >::TDoubleLinkedListNode* node = objects_.GetHead();
23+
T* t = node->GetValue();
24+
objects_.RemoveNode(node);
25+
return t;
26+
}
27+
else
28+
{
29+
T* t = new T();
30+
return t;
31+
}
32+
}
33+
34+
void reclaimObject(T* obj)
35+
{
36+
objects_.AddTail(obj);
37+
}
38+
39+
private:
40+
TDoubleLinkedList< T* > objects_;
41+
};

0 commit comments

Comments
 (0)