@@ -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