Boost logo

Boost-Commit :

From: chris_at_[hidden]
Date: 2007-09-01 02:28:55


Author: chris_kohlhoff
Date: 2007-09-01 02:28:40 EDT (Sat, 01 Sep 2007)
New Revision: 39096
URL: http://svn.boost.org/trac/boost/changeset/39096

Log:
Ensure that a strand is kept alive as long as there are wrapped handlers
for it.

Text files modified:
   trunk/boost/asio/detail/strand_service.hpp | 8 ++++----
   trunk/boost/asio/detail/wrapped_handler.hpp | 14 ++++++++++----
   trunk/boost/asio/impl/io_service.ipp | 4 ++--
   trunk/boost/asio/io_service.hpp | 2 +-
   4 files changed, 17 insertions(+), 11 deletions(-)

Modified: trunk/boost/asio/detail/strand_service.hpp
==============================================================================
--- trunk/boost/asio/detail/strand_service.hpp (original)
+++ trunk/boost/asio/detail/strand_service.hpp 2007-09-01 02:28:40 EDT (Sat, 01 Sep 2007)
@@ -417,14 +417,14 @@
     }
     else
     {
- boost::asio::detail::mutex::scoped_lock lock(impl->mutex_);
-
       // Allocate and construct an object to wrap the handler.
       typedef handler_wrapper<Handler> value_type;
       typedef handler_alloc_traits<Handler, value_type> alloc_traits;
       raw_handler_ptr<alloc_traits> raw_ptr(handler);
       handler_ptr<alloc_traits> ptr(raw_ptr, handler);
 
+ boost::asio::detail::mutex::scoped_lock lock(impl->mutex_);
+
       if (impl->current_handler_ == 0)
       {
         // This handler now has the lock, so can be dispatched immediately.
@@ -457,14 +457,14 @@
   template <typename Handler>
   void post(implementation_type& impl, Handler handler)
   {
- boost::asio::detail::mutex::scoped_lock lock(impl->mutex_);
-
     // Allocate and construct an object to wrap the handler.
     typedef handler_wrapper<Handler> value_type;
     typedef handler_alloc_traits<Handler, value_type> alloc_traits;
     raw_handler_ptr<alloc_traits> raw_ptr(handler);
     handler_ptr<alloc_traits> ptr(raw_ptr, handler);
 
+ boost::asio::detail::mutex::scoped_lock lock(impl->mutex_);
+
     if (impl->current_handler_ == 0)
     {
       // This handler now has the lock, so can be dispatched immediately.

Modified: trunk/boost/asio/detail/wrapped_handler.hpp
==============================================================================
--- trunk/boost/asio/detail/wrapped_handler.hpp (original)
+++ trunk/boost/asio/detail/wrapped_handler.hpp 2007-09-01 02:28:40 EDT (Sat, 01 Sep 2007)
@@ -17,6 +17,10 @@
 
 #include <boost/asio/detail/push_options.hpp>
 
+#include <boost/asio/detail/push_options.hpp>
+#include <boost/type_traits.hpp>
+#include <boost/asio/detail/pop_options.hpp>
+
 #include <boost/asio/detail/bind_handler.hpp>
 #include <boost/asio/detail/handler_alloc_helpers.hpp>
 #include <boost/asio/detail/handler_invoke_helpers.hpp>
@@ -31,7 +35,9 @@
 public:
   typedef void result_type;
 
- wrapped_handler(Dispatcher& dispatcher, Handler handler)
+ wrapped_handler(
+ typename boost::add_reference<Dispatcher>::type dispatcher,
+ Handler handler)
     : dispatcher_(dispatcher),
       handler_(handler)
   {
@@ -118,7 +124,7 @@
   }
 
 //private:
- Dispatcher& dispatcher_;
+ Dispatcher dispatcher_;
   Handler handler_;
 };
 
@@ -172,9 +178,9 @@
         function, this_handler->handler_));
 }
 
-template <typename Function, typename Dispatcher, typename Handler>
+template <typename Function, typename Handler, typename Context>
 inline void asio_handler_invoke(const Function& function,
- rewrapped_handler<Dispatcher, Handler>* this_handler)
+ rewrapped_handler<Handler, Context>* this_handler)
 {
   asio_handler_invoke_helpers::invoke(
       function, &this_handler->context_);

Modified: trunk/boost/asio/impl/io_service.ipp
==============================================================================
--- trunk/boost/asio/impl/io_service.ipp (original)
+++ trunk/boost/asio/impl/io_service.ipp 2007-09-01 02:28:40 EDT (Sat, 01 Sep 2007)
@@ -129,11 +129,11 @@
 #if defined(GENERATING_DOCUMENTATION)
 unspecified
 #else
-inline detail::wrapped_handler<io_service, Handler>
+inline detail::wrapped_handler<io_service&, Handler>
 #endif
 io_service::wrap(Handler handler)
 {
- return detail::wrapped_handler<io_service, Handler>(*this, handler);
+ return detail::wrapped_handler<io_service&, Handler>(*this, handler);
 }
 
 inline io_service::work::work(boost::asio::io_service& io_service)

Modified: trunk/boost/asio/io_service.hpp
==============================================================================
--- trunk/boost/asio/io_service.hpp (original)
+++ trunk/boost/asio/io_service.hpp 2007-09-01 02:28:40 EDT (Sat, 01 Sep 2007)
@@ -321,7 +321,7 @@
 #if defined(GENERATING_DOCUMENTATION)
   unspecified
 #else
- detail::wrapped_handler<io_service, Handler>
+ detail::wrapped_handler<io_service&, Handler>
 #endif
   wrap(Handler handler);
 


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk