Browse Source

always call receive handler from a streaming thread

pull/102/head
orignal 10 years ago
parent
commit
3de4010a47
  1. 2
      HTTPServer.cpp
  2. 20
      Streaming.h

2
HTTPServer.cpp

@ -878,7 +878,7 @@ namespace util
void HTTPConnection::HandleStreamReceive (const boost::system::error_code& ecode, std::size_t bytes_transferred) void HTTPConnection::HandleStreamReceive (const boost::system::error_code& ecode, std::size_t bytes_transferred)
{ {
if (bytes_transferred) if (!ecode)
{ {
boost::asio::async_write (*m_Socket, boost::asio::buffer (m_StreamBuffer, bytes_transferred), boost::asio::async_write (*m_Socket, boost::asio::buffer (m_StreamBuffer, bytes_transferred),
boost::bind (&HTTPConnection::HandleWrite, this, boost::asio::placeholders::error)); boost::bind (&HTTPConnection::HandleWrite, this, boost::asio::placeholders::error));

20
Streaming.h

@ -140,22 +140,16 @@ namespace stream
{ {
if (!m_ReceiveQueue.empty ()) if (!m_ReceiveQueue.empty ())
{ {
size_t received = ConcatenatePackets (boost::asio::buffer_cast<uint8_t *>(buffer), boost::asio::buffer_size(buffer)); m_Service.post ([=](void) { this->HandleReceiveTimer (
if (received) boost::asio::error::make_error_code (boost::asio::error::operation_aborted),
{ buffer, handler); });
// TODO: post to stream's thread
handler (boost::system::error_code (), received);
return;
}
} }
if (!m_IsOpen) else
{ {
handler (boost::asio::error::make_error_code (boost::asio::error::connection_reset), 0); m_ReceiveTimer.expires_from_now (boost::posix_time::seconds(timeout));
return; m_ReceiveTimer.async_wait ([=](const boost::system::error_code& ecode)
{ this->HandleReceiveTimer (ecode, buffer, handler); });
} }
m_ReceiveTimer.expires_from_now (boost::posix_time::seconds(timeout));
m_ReceiveTimer.async_wait ([=](const boost::system::error_code& ecode)
{ this->HandleReceiveTimer (ecode, buffer, handler); });
} }
template<typename Buffer, typename ReceiveHandler> template<typename Buffer, typename ReceiveHandler>

Loading…
Cancel
Save