Skip to content

Commit c4c1d63

Browse files
authored
Merge pull request #76 from IronsDu/feature/ShrinkReceiveBuffer
shrink receive buffer
2 parents 5ddb2cb + 4edad26 commit c4c1d63

1 file changed

Lines changed: 42 additions & 6 deletions

File tree

include/brynet/net/TcpConnection.hpp

Lines changed: 42 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ namespace brynet { namespace net {
194194
});
195195
}
196196

197-
// setDataCallback(std::function<void(brynet::base::BasePacketReader&)>)
197+
// setDataCallback(std::function<void(brynet::base::BasePacketReader&)>)
198198
template<typename Callback>
199199
void setDataCallback(Callback&& cb)
200200
{
@@ -234,6 +234,18 @@ namespace brynet { namespace net {
234234
});
235235
}
236236

237+
void postShrinkReceiveBuffer()
238+
{
239+
auto sharedThis = shared_from_this();
240+
mEventLoop->runAsyncFunctor([=]()
241+
{
242+
mEventLoop->runFunctorAfterLoop([=]()
243+
{
244+
sharedThis->shrinkReceiveBuffer();
245+
});
246+
});
247+
}
248+
237249
void postDisConnect()
238250
{
239251
auto sharedThis = shared_from_this();
@@ -347,6 +359,29 @@ namespace brynet { namespace net {
347359
}
348360
}
349361

362+
void shrinkReceiveBuffer()
363+
{
364+
auto newSize = buffer_getreadvalidcount(mRecvBuffer.get());
365+
if (newSize == 0)
366+
{
367+
newSize = std::min<size_t>(16 * 1024, mMaxRecvBufferSize);
368+
}
369+
if(newSize == buffer_getsize(mRecvBuffer.get()))
370+
{
371+
return;
372+
}
373+
374+
std::unique_ptr<struct brynet::base::buffer_s, BufferDeleter>
375+
newBuffer(brynet::base::buffer_new(newSize));
376+
buffer_write(newBuffer.get(),
377+
buffer_getreadptr(mRecvBuffer.get()),
378+
buffer_getreadvalidcount(mRecvBuffer.get()));
379+
380+
mRecvBuffer = std::move(newBuffer);
381+
mCurrentTanhXDiff = 0;
382+
mRecvBuffOriginSize = newSize;
383+
}
384+
350385
/* must called in network thread */
351386
bool onEnterEventLoop()
352387
{
@@ -603,6 +638,12 @@ namespace brynet { namespace net {
603638
buffer_adjustto_head(mRecvBuffer.get());
604639
}
605640

641+
if (buffer_getreadvalidcount(mRecvBuffer.get())
642+
== buffer_getsize(mRecvBuffer.get()))
643+
{
644+
growRecvBuffer();
645+
}
646+
606647
const auto tryRecvLen = buffer_getwritevalidcount(mRecvBuffer.get());
607648
if (tryRecvLen == 0)
608649
{
@@ -667,11 +708,6 @@ namespace brynet { namespace net {
667708

668709
mRecvData = true;
669710
buffer_addwritepos(mRecvBuffer.get(), static_cast<size_t>(retlen));
670-
if (buffer_getreadvalidcount(mRecvBuffer.get())
671-
== buffer_getsize(mRecvBuffer.get()))
672-
{
673-
growRecvBuffer();
674-
}
675711

676712
if (notInSSL && retlen < static_cast<int>(tryRecvLen))
677713
{

0 commit comments

Comments
 (0)