From eacb3aefdeaa03c72ff1af5e847827e2f8164cc3 Mon Sep 17 00:00:00 2001 From: Christopher Kohlhoff Date: Sun, 28 Jun 2009 13:20:17 +0000 Subject: [PATCH] Treat 0-byte reads and writes as no-ops to comply with the documented type requirements for SyncReadStream, AsyncReadStream, SyncWriteStream and AsyncWriteStream. [SVN r54467] --- include/boost/asio/buffered_read_stream.hpp | 43 +++++++++++++++++++- include/boost/asio/buffered_write_stream.hpp | 43 +++++++++++++++++++- 2 files changed, 84 insertions(+), 2 deletions(-) diff --git a/include/boost/asio/buffered_read_stream.hpp b/include/boost/asio/buffered_read_stream.hpp index 742123be..818915aa 100644 --- a/include/boost/asio/buffered_read_stream.hpp +++ b/include/boost/asio/buffered_read_stream.hpp @@ -230,8 +230,21 @@ public: template std::size_t read_some(const MutableBufferSequence& buffers) { + typename MutableBufferSequence::const_iterator iter = buffers.begin(); + typename MutableBufferSequence::const_iterator end = buffers.end(); + size_t total_buffer_size = 0; + for (; iter != end; ++iter) + { + boost::asio::mutable_buffer buffer(*iter); + total_buffer_size += boost::asio::buffer_size(buffer); + } + + if (total_buffer_size == 0) + return 0; + if (storage_.empty()) fill(); + return copy(buffers); } @@ -242,8 +255,22 @@ public: boost::system::error_code& ec) { ec = boost::system::error_code(); + + typename MutableBufferSequence::const_iterator iter = buffers.begin(); + typename MutableBufferSequence::const_iterator end = buffers.end(); + size_t total_buffer_size = 0; + for (; iter != end; ++iter) + { + boost::asio::mutable_buffer buffer(*iter); + total_buffer_size += boost::asio::buffer_size(buffer); + } + + if (total_buffer_size == 0) + return 0; + if (storage_.empty() && !fill(ec)) return 0; + return copy(buffers); } @@ -306,7 +333,21 @@ public: void async_read_some(const MutableBufferSequence& buffers, ReadHandler handler) { - if (storage_.empty()) + typename MutableBufferSequence::const_iterator iter = buffers.begin(); + typename MutableBufferSequence::const_iterator end = buffers.end(); + size_t total_buffer_size = 0; + for (; iter != end; ++iter) + { + boost::asio::mutable_buffer buffer(*iter); + total_buffer_size += boost::asio::buffer_size(buffer); + } + + if (total_buffer_size == 0) + { + get_io_service().post(detail::bind_handler( + handler, boost::system::error_code(), 0)); + } + else if (storage_.empty()) { async_fill(read_some_handler( get_io_service(), storage_, buffers, handler)); diff --git a/include/boost/asio/buffered_write_stream.hpp b/include/boost/asio/buffered_write_stream.hpp index 1d065412..06aa7421 100644 --- a/include/boost/asio/buffered_write_stream.hpp +++ b/include/boost/asio/buffered_write_stream.hpp @@ -187,8 +187,21 @@ public: template std::size_t write_some(const ConstBufferSequence& buffers) { + typename ConstBufferSequence::const_iterator iter = buffers.begin(); + typename ConstBufferSequence::const_iterator end = buffers.end(); + size_t total_buffer_size = 0; + for (; iter != end; ++iter) + { + boost::asio::const_buffer buffer(*iter); + total_buffer_size += boost::asio::buffer_size(buffer); + } + + if (total_buffer_size == 0) + return 0; + if (storage_.size() == storage_.capacity()) flush(); + return copy(buffers); } @@ -199,8 +212,22 @@ public: boost::system::error_code& ec) { ec = boost::system::error_code(); + + typename ConstBufferSequence::const_iterator iter = buffers.begin(); + typename ConstBufferSequence::const_iterator end = buffers.end(); + size_t total_buffer_size = 0; + for (; iter != end; ++iter) + { + boost::asio::const_buffer buffer(*iter); + total_buffer_size += boost::asio::buffer_size(buffer); + } + + if (total_buffer_size == 0) + return 0; + if (storage_.size() == storage_.capacity() && !flush(ec)) return 0; + return copy(buffers); } @@ -264,7 +291,21 @@ public: void async_write_some(const ConstBufferSequence& buffers, WriteHandler handler) { - if (storage_.size() == storage_.capacity()) + typename ConstBufferSequence::const_iterator iter = buffers.begin(); + typename ConstBufferSequence::const_iterator end = buffers.end(); + size_t total_buffer_size = 0; + for (; iter != end; ++iter) + { + boost::asio::const_buffer buffer(*iter); + total_buffer_size += boost::asio::buffer_size(buffer); + } + + if (total_buffer_size == 0) + { + get_io_service().post(detail::bind_handler( + handler, boost::system::error_code(), 0)); + } + else if (storage_.size() == storage_.capacity()) { async_flush(write_some_handler( get_io_service(), storage_, buffers, handler));