$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r69680 - in branches/release: boost/asio boost/asio/detail boost/asio/detail/impl libs/asio/doc
From: chris_at_[hidden]
Date: 2011-03-08 06:07:07
Author: chris_kohlhoff
Date: 2011-03-08 06:07:01 EST (Tue, 08 Mar 2011)
New Revision: 69680
URL: http://svn.boost.org/trac/boost/changeset/69680
Log:
Merge selected bug fixes from trunk:
* Fixed a compile error on some versions of g++ due to anonymous enums.
  Fixes #4883.
* Fixed a bug in asio::streambuf where the consume() function did not
  always update the internal buffer pointers correctly. The problem may
  occur when the asio::streambuf is filled with data using the standard
  C++ member functions such as sputn(). (Note: the problem does not
  manifest when the streambuf is populated by the Asio free functions
  read(), async_read(), read_until() or async_read_until().)
* EV_ONESHOT seems to cause problems on some versions of Mac OS X, with
  the io_service destructor getting stuck inside the close() system
  call. Use EV_CLEAR instead. Fixes #5021.
* Fixed a bug on kqueue-based platforms, where reactor read operations
  that return false from their perform() function are not correctly
  re-registered with kqueue.  
* Fixed the linger socket option on non-Windows platforms.
* Fixed function name in comment for asio::placeholders::iterator.
Text files modified: 
   branches/release/boost/asio/basic_streambuf.hpp                          |     2 ++                                      
   branches/release/boost/asio/detail/dev_poll_reactor.hpp                  |     2 +-                                      
   branches/release/boost/asio/detail/epoll_reactor.hpp                     |     2 +-                                      
   branches/release/boost/asio/detail/impl/kqueue_reactor.ipp               |    24 +++++++++++++-----------                
   branches/release/boost/asio/detail/impl/reactive_socket_service_base.ipp |     2 +-                                      
   branches/release/boost/asio/detail/select_reactor.hpp                    |     4 ++--                                    
   branches/release/boost/asio/placeholders.hpp                             |     2 +-                                      
   branches/release/boost/asio/version.hpp                                  |     2 +-                                      
   branches/release/libs/asio/doc/history.qbk                               |    21 +++++++++++++++++++--                   
   9 files changed, 41 insertions(+), 20 deletions(-)
Modified: branches/release/boost/asio/basic_streambuf.hpp
==============================================================================
--- branches/release/boost/asio/basic_streambuf.hpp	(original)
+++ branches/release/boost/asio/basic_streambuf.hpp	2011-03-08 06:07:01 EST (Tue, 08 Mar 2011)
@@ -237,6 +237,8 @@
    */
   void consume(std::size_t n)
   {
+    if (egptr() < pptr())
+      setg(&buffer_[0], gptr(), pptr());
     if (gptr() + n > pptr())
       n = pptr() - gptr();
     gbump(static_cast<int>(n));
Modified: branches/release/boost/asio/detail/dev_poll_reactor.hpp
==============================================================================
--- branches/release/boost/asio/detail/dev_poll_reactor.hpp	(original)
+++ branches/release/boost/asio/detail/dev_poll_reactor.hpp	2011-03-08 06:07:01 EST (Tue, 08 Mar 2011)
@@ -46,7 +46,7 @@
   : public boost::asio::detail::service_base<dev_poll_reactor>
 {
 public:
-  enum { read_op = 0, write_op = 1,
+  enum op_types { read_op = 0, write_op = 1,
     connect_op = 1, except_op = 2, max_ops = 3 };
 
   // Per-descriptor data.
Modified: branches/release/boost/asio/detail/epoll_reactor.hpp
==============================================================================
--- branches/release/boost/asio/detail/epoll_reactor.hpp	(original)
+++ branches/release/boost/asio/detail/epoll_reactor.hpp	2011-03-08 06:07:01 EST (Tue, 08 Mar 2011)
@@ -42,7 +42,7 @@
   : public boost::asio::detail::service_base<epoll_reactor>
 {
 public:
-  enum { read_op = 0, write_op = 1,
+  enum op_types { read_op = 0, write_op = 1,
     connect_op = 1, except_op = 2, max_ops = 3 };
 
   // Per-descriptor queues.
Modified: branches/release/boost/asio/detail/impl/kqueue_reactor.ipp
==============================================================================
--- branches/release/boost/asio/detail/impl/kqueue_reactor.ipp	(original)
+++ branches/release/boost/asio/detail/impl/kqueue_reactor.ipp	2011-03-08 06:07:01 EST (Tue, 08 Mar 2011)
@@ -47,9 +47,9 @@
     interrupter_(),
     shutdown_(false)
 {
-  // The interrupter is put into a permanently readable state. Whenever we
-  // want to interrupt the blocked kevent call we register a one-shot read
-  // operation against the descriptor.
+  // The interrupter is put into a permanently readable state. Whenever we want
+  // to interrupt the blocked kevent call we register a read operation against
+  // the descriptor.
   interrupter_.interrupt();
 }
 
@@ -139,17 +139,17 @@
     {
     case read_op:
       BOOST_ASIO_KQUEUE_EV_SET(&event, descriptor, EVFILT_READ,
-          EV_ADD | EV_ONESHOT, 0, 0, descriptor_data);
+          EV_ADD | EV_CLEAR, 0, 0, descriptor_data);
       break;
     case write_op:
       BOOST_ASIO_KQUEUE_EV_SET(&event, descriptor, EVFILT_WRITE,
-          EV_ADD | EV_ONESHOT, 0, 0, descriptor_data);
+          EV_ADD | EV_CLEAR, 0, 0, descriptor_data);
       break;
     case except_op:
       if (!descriptor_data->op_queue_[read_op].empty())
         return; // Already registered for read events.
       BOOST_ASIO_KQUEUE_EV_SET(&event, descriptor, EVFILT_READ,
-          EV_ADD | EV_ONESHOT, EV_OOBAND, 0, descriptor_data);
+          EV_ADD | EV_CLEAR, EV_OOBAND, 0, descriptor_data);
       break;
     }
 
@@ -247,7 +247,7 @@
     if (ptr == &interrupter_)
     {
       // No need to reset the interrupter since we're leaving the descriptor
-      // in a ready-to-read state and relying on one-shot notifications.
+      // in a ready-to-read state and relying on edge-triggered notifications.
     }
     else
     {
@@ -296,18 +296,20 @@
       case EVFILT_READ:
         if (!descriptor_data->op_queue_[read_op].empty())
           BOOST_ASIO_KQUEUE_EV_SET(&event, descriptor, EVFILT_READ,
-              EV_ADD | EV_ONESHOT, 0, 0, descriptor_data);
+              EV_ADD | EV_CLEAR, 0, 0, descriptor_data);
         else if (!descriptor_data->op_queue_[except_op].empty())
           BOOST_ASIO_KQUEUE_EV_SET(&event, descriptor, EVFILT_READ,
-              EV_ADD | EV_ONESHOT, EV_OOBAND, 0, descriptor_data);
+              EV_ADD | EV_CLEAR, EV_OOBAND, 0, descriptor_data);
         else
           continue;
+        break;
       case EVFILT_WRITE:
         if (!descriptor_data->op_queue_[write_op].empty())
           BOOST_ASIO_KQUEUE_EV_SET(&event, descriptor, EVFILT_WRITE,
-              EV_ADD | EV_ONESHOT, 0, 0, descriptor_data);
+              EV_ADD | EV_CLEAR, 0, 0, descriptor_data);
         else
           continue;
+        break;
       default:
         break;
       }
@@ -336,7 +338,7 @@
 {
   struct kevent event;
   BOOST_ASIO_KQUEUE_EV_SET(&event, interrupter_.read_descriptor(),
-      EVFILT_READ, EV_ADD | EV_ONESHOT, 0, 0, &interrupter_);
+      EVFILT_READ, EV_ADD | EV_CLEAR, 0, 0, &interrupter_);
   ::kevent(kqueue_fd_, &event, 1, 0, 0, 0);
 }
 
Modified: branches/release/boost/asio/detail/impl/reactive_socket_service_base.ipp
==============================================================================
--- branches/release/boost/asio/detail/impl/reactive_socket_service_base.ipp	(original)
+++ branches/release/boost/asio/detail/impl/reactive_socket_service_base.ipp	2011-03-08 06:07:01 EST (Tue, 08 Mar 2011)
@@ -64,7 +64,7 @@
   if (is_open(impl))
     reactor_.close_descriptor(impl.socket_, impl.reactor_data_);
 
-  if (socket_ops::close(impl.socket_, impl.state_, true, ec) == 0)
+  if (socket_ops::close(impl.socket_, impl.state_, false, ec) == 0)
     construct(impl);
 
   return ec;
Modified: branches/release/boost/asio/detail/select_reactor.hpp
==============================================================================
--- branches/release/boost/asio/detail/select_reactor.hpp	(original)
+++ branches/release/boost/asio/detail/select_reactor.hpp	2011-03-08 06:07:01 EST (Tue, 08 Mar 2011)
@@ -51,10 +51,10 @@
 {
 public:
 #if defined(BOOST_WINDOWS) || defined(__CYGWIN__)
-  enum { read_op = 0, write_op = 1, except_op = 2,
+  enum op_types { read_op = 0, write_op = 1, except_op = 2,
     max_select_ops = 3, connect_op = 3, max_ops = 4 };
 #else // defined(BOOST_WINDOWS) || defined(__CYGWIN__)
-  enum { read_op = 0, write_op = 1, except_op = 2,
+  enum op_types { read_op = 0, write_op = 1, except_op = 2,
     max_select_ops = 3, connect_op = 1, max_ops = 3 };
 #endif // defined(BOOST_WINDOWS) || defined(__CYGWIN__)
 
Modified: branches/release/boost/asio/placeholders.hpp
==============================================================================
--- branches/release/boost/asio/placeholders.hpp	(original)
+++ branches/release/boost/asio/placeholders.hpp	2011-03-08 06:07:01 EST (Tue, 08 Mar 2011)
@@ -39,7 +39,7 @@
 
 /// An argument placeholder, for use with boost::bind(), that corresponds to
 /// the iterator argument of a handler for asynchronous functions such as
-/// boost::asio::basic_resolver::resolve.
+/// boost::asio::basic_resolver::async_resolve.
 unspecified iterator;
 
 #elif defined(__BORLANDC__) || defined(__GNUC__)
Modified: branches/release/boost/asio/version.hpp
==============================================================================
--- branches/release/boost/asio/version.hpp	(original)
+++ branches/release/boost/asio/version.hpp	2011-03-08 06:07:01 EST (Tue, 08 Mar 2011)
@@ -18,6 +18,6 @@
 // BOOST_ASIO_VERSION % 100 is the sub-minor version
 // BOOST_ASIO_VERSION / 100 % 1000 is the minor version
 // BOOST_ASIO_VERSION / 100000 is the major version
-#define BOOST_ASIO_VERSION 100408 // 1.4.8
+#define BOOST_ASIO_VERSION 100409 // 1.4.9
 
 #endif // BOOST_ASIO_VERSION_HPP
Modified: branches/release/libs/asio/doc/history.qbk
==============================================================================
--- branches/release/libs/asio/doc/history.qbk	(original)
+++ branches/release/libs/asio/doc/history.qbk	2011-03-08 06:07:01 EST (Tue, 08 Mar 2011)
@@ -7,10 +7,27 @@
 
 [section:history Revision History]
 
+[heading Asio 1.4.9 / Boost 1.46.1]
+
+* `EV_ONESHOT` seems to cause problems on some versions of Mac OS X, with the
+  `io_service` destructor getting stuck inside the `close()` system call.
+  Changed the kqueue backend to use `EV_CLEAR` instead
+  ([@https://svn.boost.org/trac/boost/ticket/5021 #5021]).
+* Fixed compile failures with some versions of [^g++] due to the use of
+  anonymous enums ([@https://svn.boost.org/trac/boost/ticket/4883 #4883]).
+* Fixed a bug on kqueue-based platforms, where some system calls that
+  repeatedly fail with `EWOULDBLOCK` are not correctly re-registered with
+  kqueue.
+* Changed `asio::streambuf` to ensure that its internal pointers are updated
+  correctly after the data has been modified using `std::streambuf` member
+  functions.
+* Fixed a bug that prevented the linger socket option from working on platforms
+  other than Windows.
+
 [heading Asio 1.4.8 / Boost 1.46]
 
-* Fixed an integer overflow problem that occurs when `ip::address_v4::netmask()`
-  is used on 64-bit platforms.
+* Fixed an integer overflow problem that occurs when
+  `ip::address_v4::broadcast()` is used on 64-bit platforms.
 * Fixed a problem on older Linux kernels (where epoll is used without timerfd
   support) that prevents timely delivery of deadline_timer handlers, after the
   program has been running for some time