@@ -74,6 +74,8 @@ uint32_t TransportMessage::fillData(const uint8_t* data, uint32_t length)
74
74
}
75
75
if (data) {
76
76
memcpy (m_buffer.get () + m_receivedBytes, data, length);
77
+ } else {
78
+ length = 0 ;
77
79
}
78
80
m_receivedBytes += length;
79
81
return length;
@@ -157,10 +159,19 @@ void TransportSession::sendData(TransportData data)
157
159
return ;
158
160
}
159
161
auto self (shared_from_this ());
160
- m_service->post (boost::bind (&TransportSession::sendHandler, self, data));
162
+ m_service->post (boost::bind (&TransportSession::prepareSend, self, data));
163
+ }
164
+
165
+ void TransportSession::prepareSend (TransportData data)
166
+ {
167
+ // Only access m_sendQueue in IO service thread.
168
+ m_sendQueue.push (data);
169
+ if (m_sendQueue.size () == 1 ) {
170
+ sendHandler ();
171
+ }
161
172
}
162
173
163
- void TransportSession::sendHandler (TransportData data )
174
+ void TransportSession::sendHandler ()
164
175
{
165
176
if (m_isClosed) {
166
177
return ;
@@ -169,7 +180,11 @@ void TransportSession::sendHandler(TransportData data)
169
180
ELOG_WARN (" sendHandler: socket is not open" );
170
181
return ;
171
182
}
183
+ if (m_sendQueue.empty ()) {
184
+ return ;
185
+ }
172
186
187
+ TransportData data = m_sendQueue.front ();
173
188
TransportMessage toSend (data.buffer .get (), data.length );
174
189
TransportData wrappedData{toSend.messageData (),
175
190
toSend.messageLength ()};
@@ -197,13 +212,18 @@ void TransportSession::writeHandler(
197
212
const boost::system::error_code& ec,
198
213
std::size_t bytes)
199
214
{
215
+ assert (m_sendQueue.size () > 0 );
216
+ m_sendQueue.pop ();
200
217
if (ec) {
201
218
ELOG_DEBUG (" Error writing data: %s" , ec.message ().c_str ());
202
219
if (!m_isClosed) {
203
220
m_isClosed = true ;
204
221
// Notify the listener about the socket error if the listener is not closing me.
205
222
m_listener->onClose (m_id);
206
223
}
224
+ } else {
225
+ ELOG_DEBUG (" Wrote data: %zu" , bytes);
226
+ sendHandler ();
207
227
}
208
228
}
209
229
@@ -254,6 +274,7 @@ void TransportSession::receiveData()
254
274
255
275
uint32_t bytesToRead = m_receivedMessage.missingBytes ();
256
276
assert (bytesToRead > 0 );
277
+
257
278
if (bytesToRead > m_receivedBufferSize) {
258
279
// Double the received buffer size
259
280
m_receivedBufferSize = std::max (m_receivedBufferSize * 2 , bytesToRead);
@@ -286,7 +307,10 @@ void TransportSession::readHandler(
286
307
if (!ec || ec.value () == boost::asio::error::message_size) {
287
308
uint32_t bytesToRead = m_receivedMessage.missingBytes ();
288
309
assert (bytesToRead >= bytes);
289
- m_receivedMessage.fillData (m_receivedBuffer.get (), bytes);
310
+ uint32_t filled = m_receivedMessage.fillData (m_receivedBuffer.get (), bytes);
311
+ if (filled != bytes) {
312
+ ELOG_WARN (" Message fill length %u, %zu\n " , filled, bytes);
313
+ }
290
314
receiveData ();
291
315
} else {
292
316
if (ec.value () != boost::system::errc::operation_canceled &&
0 commit comments