$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
From: chris_at_[hidden]
Date: 2007-10-20 21:48:04
Author: chris_kohlhoff
Date: 2007-10-20 21:48:03 EDT (Sat, 20 Oct 2007)
New Revision: 40241
URL: http://svn.boost.org/trac/boost/changeset/40241
Log:
Ensure the buffers and completion condition objects are destroyed before
the completion handler is invoked.
Text files modified: 
   trunk/boost/asio/impl/read.ipp  |    20 ++++++++++++--------                    
   trunk/boost/asio/impl/write.ipp |    18 ++++++++++++------                      
   2 files changed, 24 insertions(+), 14 deletions(-)
Modified: trunk/boost/asio/impl/read.ipp
==============================================================================
--- trunk/boost/asio/impl/read.ipp	(original)
+++ trunk/boost/asio/impl/read.ipp	2007-10-20 21:48:03 EDT (Sat, 20 Oct 2007)
@@ -19,6 +19,7 @@
 
 #include <boost/asio/detail/push_options.hpp>
 #include <algorithm>
+#include <boost/optional.hpp>
 #include <boost/asio/detail/pop_options.hpp>
 
 #include <boost/asio/buffer.hpp>
@@ -139,23 +140,25 @@
         std::size_t bytes_transferred)
     {
       total_transferred_ += bytes_transferred;
-      buffers_.consume(bytes_transferred);
-      if (completion_condition_(ec, total_transferred_)
-          || buffers_.begin() == buffers_.end())
+      buffers_->consume(bytes_transferred);
+      if ((*completion_condition_)(ec, total_transferred_)
+          || buffers_->begin() == buffers_->end())
       {
+        buffers_.reset();
+        completion_condition_.reset();
         handler_(ec, total_transferred_);
       }
       else
       {
-        stream_.async_read_some(buffers_, *this);
+        stream_.async_read_some(*buffers_, *this);
       }
     }
 
   //private:
     AsyncReadStream& stream_;
-    buffers_type buffers_;
+    boost::optional<buffers_type> buffers_;
     std::size_t total_transferred_;
-    CompletionCondition completion_condition_;
+    boost::optional<CompletionCondition> completion_condition_;
     ReadHandler handler_;
   };
 
@@ -236,8 +239,9 @@
       total_transferred_ += bytes_transferred;
       streambuf_.commit(bytes_transferred);
       if (streambuf_.size() == streambuf_.max_size()
-          || completion_condition_(ec, total_transferred_))
+          || (*completion_condition_)(ec, total_transferred_))
       {
+        completion_condition_.reset();
         handler_(ec, total_transferred_);
       }
       else
@@ -252,7 +256,7 @@
     AsyncReadStream& stream_;
     boost::asio::basic_streambuf<Allocator>& streambuf_;
     std::size_t total_transferred_;
-    CompletionCondition completion_condition_;
+    boost::optional<CompletionCondition> completion_condition_;
     ReadHandler handler_;
   };
 
Modified: trunk/boost/asio/impl/write.ipp
==============================================================================
--- trunk/boost/asio/impl/write.ipp	(original)
+++ trunk/boost/asio/impl/write.ipp	2007-10-20 21:48:03 EDT (Sat, 20 Oct 2007)
@@ -17,6 +17,10 @@
 
 #include <boost/asio/detail/push_options.hpp>
 
+#include <boost/asio/detail/push_options.hpp>
+#include <boost/optional.hpp>
+#include <boost/asio/detail/pop_options.hpp>
+
 #include <boost/asio/buffer.hpp>
 #include <boost/asio/completion_condition.hpp>
 #include <boost/asio/detail/bind_handler.hpp>
@@ -125,23 +129,25 @@
         std::size_t bytes_transferred)
     {
       total_transferred_ += bytes_transferred;
-      buffers_.consume(bytes_transferred);
-      if (completion_condition_(ec, total_transferred_)
-          || buffers_.begin() == buffers_.end())
+      buffers_->consume(bytes_transferred);
+      if ((*completion_condition_)(ec, total_transferred_)
+          || buffers_->begin() == buffers_->end())
       {
+        buffers_.reset();
+        completion_condition_.reset();
         handler_(ec, total_transferred_);
       }
       else
       {
-        stream_.async_write_some(buffers_, *this);
+        stream_.async_write_some(*buffers_, *this);
       }
     }
 
   //private:
     AsyncWriteStream& stream_;
-    buffers_type buffers_;
+    boost::optional<buffers_type> buffers_;
     std::size_t total_transferred_;
-    CompletionCondition completion_condition_;
+    boost::optional<CompletionCondition> completion_condition_;
     WriteHandler handler_;
   };