$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
From: chris_at_[hidden]
Date: 2007-12-03 06:56:16
Author: chris_kohlhoff
Date: 2007-12-03 06:56:15 EST (Mon, 03 Dec 2007)
New Revision: 41640
URL: http://svn.boost.org/trac/boost/changeset/41640
Log:
Merge revisions 41407, 41432, 41477, 41478 from trunk.
Text files modified: 
   branches/release/boost/asio/detail/posix_fd_set_adapter.hpp |    13 +++-                                    
   branches/release/boost/asio/detail/reactor_op_queue.hpp     |     7 ++                                      
   branches/release/boost/asio/detail/win_fd_set_adapter.hpp   |     8 ++                                      
   branches/release/boost/asio/error.hpp                       |     7 ++                                      
   branches/release/libs/asio/doc/design/implementation.qbk    |     6 -                                       
   branches/release/libs/asio/doc/using.qbk                    |    96 ++++++++++++++++++++++++++++++++++++++++
   branches/release/libs/asio/test/ip/multicast.cpp            |    20 +++++--                                 
   7 files changed, 138 insertions(+), 19 deletions(-)
Modified: branches/release/boost/asio/detail/posix_fd_set_adapter.hpp
==============================================================================
--- branches/release/boost/asio/detail/posix_fd_set_adapter.hpp	(original)
+++ branches/release/boost/asio/detail/posix_fd_set_adapter.hpp	2007-12-03 06:56:15 EST (Mon, 03 Dec 2007)
@@ -36,11 +36,16 @@
     FD_ZERO(&fd_set_);
   }
 
-  void set(socket_type descriptor)
+  bool set(socket_type descriptor)
   {
-    if (max_descriptor_ == invalid_socket || descriptor > max_descriptor_)
-      max_descriptor_ = descriptor;
-    FD_SET(descriptor, &fd_set_);
+    if (descriptor < FD_SETSIZE)
+    {
+      if (max_descriptor_ == invalid_socket || descriptor > max_descriptor_)
+        max_descriptor_ = descriptor;
+      FD_SET(descriptor, &fd_set_);
+      return true;
+    }
+    return false;
   }
 
   bool is_set(socket_type descriptor) const
Modified: branches/release/boost/asio/detail/reactor_op_queue.hpp
==============================================================================
--- branches/release/boost/asio/detail/reactor_op_queue.hpp	(original)
+++ branches/release/boost/asio/detail/reactor_op_queue.hpp	2007-12-03 06:56:15 EST (Mon, 03 Dec 2007)
@@ -174,8 +174,13 @@
     typename operation_map::iterator i = operations_.begin();
     while (i != operations_.end())
     {
-      descriptors.set(i->first);
+      Descriptor descriptor = i->first;
       ++i;
+      if (!descriptors.set(descriptor))
+      {
+        boost::system::error_code ec(error::fd_set_failure);
+        dispatch_all_operations(descriptor, ec);
+      }
     }
   }
 
Modified: branches/release/boost/asio/detail/win_fd_set_adapter.hpp
==============================================================================
--- branches/release/boost/asio/detail/win_fd_set_adapter.hpp	(original)
+++ branches/release/boost/asio/detail/win_fd_set_adapter.hpp	2007-12-03 06:56:15 EST (Mon, 03 Dec 2007)
@@ -37,13 +37,17 @@
     fd_set_.fd_count = 0;
   }
 
-  void set(socket_type descriptor)
+  bool set(socket_type descriptor)
   {
     for (u_int i = 0; i < fd_set_.fd_count; ++i)
       if (fd_set_.fd_array[i] == descriptor)
-        return;
+        return true;
     if (fd_set_.fd_count < win_fd_set_size)
+    {
       fd_set_.fd_array[fd_set_.fd_count++] = descriptor;
+      return true;
+    }
+    return false;
   }
 
   bool is_set(socket_type descriptor) const
Modified: branches/release/boost/asio/error.hpp
==============================================================================
--- branches/release/boost/asio/error.hpp	(original)
+++ branches/release/boost/asio/error.hpp	2007-12-03 06:56:15 EST (Mon, 03 Dec 2007)
@@ -195,7 +195,10 @@
   eof,
 
   /// Element not found.
-  not_found
+  not_found,
+
+  /// The descriptor cannot fit into the select system call's fd_set.
+  fd_set_failure
 };
 
 enum ssl_errors
@@ -301,6 +304,8 @@
       return "End of file";
     if (value == error::not_found)
       return "Element not found";
+    if (value == error::fd_set_failure)
+      return "The descriptor does not fit into the select call's fd_set";
     return "asio.misc error";
   }
 };
Modified: branches/release/libs/asio/doc/design/implementation.qbk
==============================================================================
--- branches/release/libs/asio/doc/design/implementation.qbk	(original)
+++ branches/release/libs/asio/doc/design/implementation.qbk	2007-12-03 06:56:15 EST (Mon, 03 Dec 2007)
@@ -194,8 +194,7 @@
 * Uses overlapped I/O and I/O completion ports for all asynchronous socket
 operations except for asynchronous connect.
 
-* Uses `select` for `deadline_timer` operations and for emulating asynchronous
-connect.
+* Uses `select` for emulating asynchronous connect.
 
 Threads:
 
@@ -204,8 +203,7 @@
 `io_service::poll_one()`.
 
 * An additional thread per `io_service` is used for the `select`
-demultiplexing. This thread is created whenever the first `deadline_timer` is
-created, or on the first call to `async_connect()`.
+demultiplexing. This thread is created on the first call to `async_connect()`.
 
 * An additional thread per `io_service` is used to emulate asynchronous host
 resolution. This thread is created on the first call to either
Modified: branches/release/libs/asio/doc/using.qbk
==============================================================================
--- branches/release/libs/asio/doc/using.qbk	(original)
+++ branches/release/libs/asio/doc/using.qbk	2007-12-03 06:56:15 EST (Mon, 03 Dec 2007)
@@ -130,4 +130,100 @@
 
 ]
 
+[heading Macros]
+
+The macros listed in the table below may be used to control the behaviour of
+Boost.Asio.
+
+[table
+  [[Macro][Description]]
+  [
+    [`BOOST_ASIO_ENABLE_BUFFER_DEBUGGING`]
+    [
+      Enables Boost.Asio's buffer debugging support, which can help identify when
+      invalid buffers are used in read or write operations (e.g. if a
+      std::string object being written is destroyed before the write operation
+      completes).
+
+      When using Microsoft Visual C++, this macro is defined automatically if
+      the compiler's iterator debugging support is enabled, unless
+      `BOOST_ASIO_DISABLE_BUFFER_DEBUGGING` has been defined.
+
+      When using g++, this macro is defined automatically if standard library
+      debugging is enabled (`_GLIBCXX_DEBUG` is defined), unless
+      `BOOST_ASIO_DISABLE_BUFFER_DEBUGGING` has been defined.
+    ]
+  ]
+  [
+    [`BOOST_ASIO_DISABLE_BUFFER_DEBUGGING`]
+    [
+      Explictly disables Boost.Asio's buffer debugging support.
+    ]
+  ]
+  [
+    [`BOOST_ASIO_DISABLE_DEV_POLL`]
+    [
+      Explicitly disables [^/dev/poll] support on Solaris, forcing the use of
+      a `select`-based implementation.
+    ]
+  ]
+  [
+    [`BOOST_ASIO_DISABLE_EPOLL`]
+    [
+      Explicitly disables `epoll` support on Linux, forcing the use of a
+      `select`-based implementation.
+    ]
+  ]
+  [
+    [`BOOST_ASIO_DISABLE_KQUEUE`]
+    [
+      Explicitly disables `kqueue` support on Mac OS X and BSD variants,
+      forcing the use of a `select`-based implementation.
+    ]
+  ]
+  [
+    [`BOOST_ASIO_DISABLE_IOCP`]
+    [
+      Explicitly disables I/O completion ports support on Windows, forcing the
+      use of a `select`-based implementation.
+    ]
+  ]
+  [
+    [`BOOST_ASIO_NO_WIN32_LEAN_AND_MEAN`]
+    [
+      By default, Boost.Asio will automatically define `WIN32_LEAN_AND_MEAN` when
+      compiling for Windows, to minimise the number of Windows SDK header files
+      and features that are included. The presence of
+      `BOOST_ASIO_NO_WIN32_LEAN_AND_MEAN` prevents `WIN32_LEAN_AND_MEAN` from
+      being defined.
+    ]
+  ]
+  [
+    [`BOOST_ASIO_NO_DEFAULT_LINKED_LIBS`]
+    [
+      When compiling for Windows using Microsoft Visual C++ or Borland C++, Boost.Asio
+      will automatically link in the necessary Windows SDK libraries for sockets
+      support (i.e. [^ws2_32.lib] and [^mswsock.lib], or [^ws2.lib] when
+      building for Windows CE). The `BOOST_ASIO_NO_DEFAULT_LINKED_LIBS` macro
+      prevents these libraries from being linked.
+    ]
+  ]
+  [
+    [`BOOST_ASIO_SOCKET_STREAMBUF_MAX_ARITY`]
+    [
+      Determines the maximum number of arguments that may be passed to the 
+      `basic_socket_streambuf` class template's `connect` member function.
+      Defaults to 5.
+    ]
+  ]
+  [
+    [`BOOST_ASIO_SOCKET_IOSTREAM_MAX_ARITY`]
+    [
+      Determines the maximum number of arguments that may be passed to the 
+      `basic_socket_iostream` class template's constructor and `connect` member
+      function. Defaults to 5.
+    ]
+  ]
+]
+
 [endsect]
Modified: branches/release/libs/asio/test/ip/multicast.cpp
==============================================================================
--- branches/release/libs/asio/test/ip/multicast.cpp	(original)
+++ branches/release/libs/asio/test/ip/multicast.cpp	2007-12-03 06:56:15 EST (Mon, 03 Dec 2007)
@@ -106,7 +106,7 @@
 
 #if defined(__hpux)
 // HP-UX doesn't declare this function extern "C", so it is declared again here
-// to avoid a linker errors about an undefined symbol.
+// to avoid a linker error about an undefined symbol.
 extern "C" unsigned int if_nametoindex(const char*);
 #endif // defined(__hpux)
 
@@ -132,8 +132,16 @@
 
   BOOST_CHECK(have_v4 || have_v6);
 
+#if defined(BOOST_WINDOWS) && defined(UNDER_CE)
+  // Windows CE seems to have problems with some multicast group addresses.
+  // The following address works on CE, but as it is not a private multicast
+  // address it will not be used on other platforms.
+  const ip::address multicast_address_v4 =
+    ip::address::from_string("239.0.0.4", ec);
+#else // defined(BOOST_WINDOWS) && defined(UNDER_CE)
   const ip::address multicast_address_v4 =
     ip::address::from_string("239.255.0.1", ec);
+#endif // defined(BOOST_WINDOWS) && defined(UNDER_CE)
   BOOST_CHECK(!have_v4 || !ec);
 
   const ip::address multicast_address_v6 =
@@ -261,9 +269,8 @@
     ip::multicast::enable_loopback enable_loopback2;
     sock_v4.get_option(enable_loopback2, ec);
 #if defined(BOOST_WINDOWS) && defined(UNDER_CE)
-    // Option is not supported under Windows CE.
-    BOOST_CHECK_MESSAGE(ec == boost::asio::error::no_protocol_option,
-        ec.value() << ", " << ec.message());
+    // Not supported under Windows CE but can get value.
+    BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
 #else // defined(BOOST_WINDOWS) && defined(UNDER_CE)
     BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
     BOOST_CHECK(enable_loopback2.value());
@@ -287,9 +294,8 @@
     ip::multicast::enable_loopback enable_loopback4;
     sock_v4.get_option(enable_loopback4, ec);
 #if defined(BOOST_WINDOWS) && defined(UNDER_CE)
-    // Option is not supported under Windows CE.
-    BOOST_CHECK_MESSAGE(ec == boost::asio::error::no_protocol_option,
-        ec.value() << ", " << ec.message());
+    // Not supported under Windows CE but can get value.
+    BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
 #else // defined(BOOST_WINDOWS) && defined(UNDER_CE)
     BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
     BOOST_CHECK(!enable_loopback4.value());