@@ -47,6 +47,42 @@ namespace brynet { namespace net {
4747 virtual size_t size () = 0;
4848 };
4949
50+ class StringSendMsg : public SendableMsg
51+ {
52+ public:
53+ explicit StringSendMsg (const char * buffer, size_t len)
54+ :
55+ mMsg(buffer, len)
56+ {}
57+
58+ explicit StringSendMsg (std::string buffer)
59+ :
60+ mMsg(std::move(buffer))
61+ {}
62+
63+ const void * data () override
64+ {
65+ return static_cast <const void *>(mMsg .data ());
66+ }
67+ size_t size () override
68+ {
69+ return mMsg .size ();
70+ }
71+
72+ private:
73+ std::string mMsg ;
74+ };
75+
76+ static SendableMsg::Ptr MakeStringMsg (const char * buffer, size_t len)
77+ {
78+ return std::make_shared<StringSendMsg>(buffer, len);
79+ }
80+
81+ static SendableMsg::Ptr MakeStringMsg (std::string buffer)
82+ {
83+ return std::make_shared<StringSendMsg>(std::move (buffer));
84+ }
85+
5086 class TcpConnection : public Channel ,
5187 public brynet::base::NonCopyable,
5288 public std::enable_shared_from_this<TcpConnection>
@@ -58,6 +94,7 @@ namespace brynet { namespace net {
5894 using DataCallback = std::function<void (brynet::base::BasePacketReader&)>;
5995 using DisconnectedCallback = std::function<void (Ptr)>;
6096 using PacketSendedCallback = std::function<void (void )>;
97+ using HighWaterCallback = std::function<void (void )>;
6198
6299 public:
63100 Ptr static Create (TcpSocket::Ptr socket,
@@ -135,12 +172,24 @@ namespace brynet { namespace net {
135172 auto sharedThis = shared_from_this ();
136173 mEventLoop ->runAsyncFunctor ([sharedThis, msg, callback]() mutable
137174 {
175+ if (sharedThis->mAlreadyClose )
176+ {
177+ return ;
178+ }
179+
138180 const auto len = msg->size ();
181+ sharedThis->mSendingMsgSize += len;
139182 sharedThis->mSendList .emplace_back (PendingPacket{
140183 std::move (msg),
141184 len,
142185 std::move (callback) });
143186 sharedThis->runAfterFlush ();
187+
188+ if (sharedThis->mSendingMsgSize > sharedThis->mHighWaterSize &&
189+ sharedThis->mHighWaterCallback != nullptr )
190+ {
191+ sharedThis->mHighWaterCallback ();
192+ }
144193 });
145194 }
146195
@@ -149,49 +198,14 @@ namespace brynet { namespace net {
149198 size_t len,
150199 PacketSendedCallback&& callback = nullptr )
151200 {
152- send (std::make_shared<std::string> (buffer, len), std::move (callback));
201+ send (MakeStringMsg (buffer, len), std::move (callback));
153202 }
154203
155204 void send (
156- const std::shared_ptr<std:: string>& packet ,
205+ std::string buffer ,
157206 PacketSendedCallback&& callback = nullptr )
158207 {
159- class StringSendMsg : public SendableMsg
160- {
161- public:
162- explicit StringSendMsg (std::shared_ptr<std::string>&& msg)
163- :
164- mMsg(std::move(msg))
165- {}
166- explicit StringSendMsg (const std::shared_ptr<std::string>& msg)
167- :
168- mMsg(msg)
169- {}
170-
171- const void * data () override
172- {
173- return static_cast <const void *>(mMsg ->data ());
174- }
175-
176- size_t size () override
177- {
178- return mMsg ->size ();
179- }
180-
181- private:
182- std::shared_ptr<std::string> mMsg ;
183- };
184-
185- auto sharedThis = shared_from_this ();
186- mEventLoop ->runAsyncFunctor ([sharedThis, packet, callback]() mutable
187- {
188- const auto len = packet->size ();
189- sharedThis->mSendList .emplace_back (PendingPacket{
190- std::make_shared<StringSendMsg>(std::move (packet)),
191- len,
192- std::move (callback) });
193- sharedThis->runAfterFlush ();
194- });
208+ send (MakeStringMsg (std::move (buffer)), std::move (callback));
195209 }
196210
197211 // setDataCallback(std::function<void(brynet::base::BasePacketReader&)>)
@@ -234,6 +248,16 @@ namespace brynet { namespace net {
234248 });
235249 }
236250
251+ void setHighWaterCallback (HighWaterCallback cb, size_t size)
252+ {
253+ auto sharedThis = shared_from_this ();
254+ mEventLoop ->runAsyncFunctor ([=]() mutable
255+ {
256+ sharedThis->mHighWaterCallback = std::move (cb);
257+ sharedThis->mHighWaterSize = size;
258+ });
259+ }
260+
237261 void postShrinkReceiveBuffer ()
238262 {
239263 auto sharedThis = shared_from_this ();
@@ -288,7 +312,9 @@ namespace brynet { namespace net {
288312 mEventLoop(std::move(eventLoop)),
289313 mAlreadyClose(false ),
290314 mMaxRecvBufferSize(maxRecvBufferSize),
291- mEnterCallback(std::move(enterCallback))
315+ mSendingMsgSize(0 ),
316+ mEnterCallback(std::move(enterCallback)),
317+ mHighWaterSize(0 )
292318 {
293319 mRecvData = false ;
294320 mCheckTime = std::chrono::steady_clock::duration::zero ();
@@ -850,6 +876,7 @@ namespace brynet { namespace net {
850876 {
851877 (packet.mCompleteCallback )();
852878 }
879+ mSendingMsgSize -= packet.data ->size ();
853880 it = mSendList .erase (it);
854881 }
855882
@@ -928,6 +955,7 @@ namespace brynet { namespace net {
928955 {
929956 b.mCompleteCallback ();
930957 }
958+ mSendingMsgSize -= b.data ->size ();
931959 it = mSendList .erase (it);
932960 }
933961
@@ -980,9 +1008,11 @@ namespace brynet { namespace net {
9801008 });
9811009
9821010 mCanWrite = false ;
983- mDisConnectCallback = nullptr ;
9841011 mDataCallback = nullptr ;
1012+ mDisConnectCallback = nullptr ;
1013+ mHighWaterCallback = nullptr ;
9851014 mRecvBuffer = nullptr ;
1015+ mSendList .clear ();
9861016 }
9871017
9881018 void procCloseInLoop ()
@@ -1212,10 +1242,13 @@ namespace brynet { namespace net {
12121242
12131243 using PacketListType = std::deque<PendingPacket>;
12141244 PacketListType mSendList ;
1245+ size_t mSendingMsgSize ;
12151246
12161247 EnterCallback mEnterCallback ;
12171248 DataCallback mDataCallback ;
12181249 DisconnectedCallback mDisConnectCallback ;
1250+ HighWaterCallback mHighWaterCallback ;
1251+ size_t mHighWaterSize ;
12191252
12201253 bool mIsPostFlush ;
12211254
0 commit comments