Imported Upstream version 1.57.0
[platform/upstream/boost.git] / boost / asio / detail / win_fd_set_adapter.hpp
index afb40d0..89f5ffd 100644 (file)
@@ -2,7 +2,7 @@
 // detail/win_fd_set_adapter.hpp
 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 //
-// Copyright (c) 2003-2012 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+// Copyright (c) 2003-2014 Christopher M. Kohlhoff (chris at kohlhoff dot com)
 //
 // Distributed under the Boost Software License, Version 1.0. (See accompanying
 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 
 #include <boost/asio/detail/config.hpp>
 
-#if defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+#if defined(BOOST_ASIO_WINDOWS) || defined(__CYGWIN__)
 
 #include <boost/asio/detail/noncopyable.hpp>
+#include <boost/asio/detail/reactor_op_queue.hpp>
 #include <boost/asio/detail/socket_types.hpp>
 
 #include <boost/asio/detail/push_options.hpp>
@@ -61,26 +62,22 @@ public:
       if (fd_set_->fd_array[i] == descriptor)
         return true;
 
-    if (fd_set_->fd_count == capacity_)
-    {
-      u_int new_capacity = capacity_ + capacity_ / 2;
-      win_fd_set* new_fd_set = static_cast<win_fd_set*>(::operator new(
-            sizeof(win_fd_set) - sizeof(SOCKET)
-            + sizeof(SOCKET) * (new_capacity)));
-
-      new_fd_set->fd_count = fd_set_->fd_count;
-      for (u_int i = 0; i < fd_set_->fd_count; ++i)
-        new_fd_set->fd_array[i] = fd_set_->fd_array[i];
-
-      ::operator delete(fd_set_);
-      fd_set_ = new_fd_set;
-      capacity_ = new_capacity;
-    }
-
+    reserve(fd_set_->fd_count + 1);
     fd_set_->fd_array[fd_set_->fd_count++] = descriptor;
     return true;
   }
 
+  void set(reactor_op_queue<socket_type>& operations, op_queue<operation>&)
+  {
+    reactor_op_queue<socket_type>::iterator i = operations.begin();
+    while (i != operations.end())
+    {
+      reactor_op_queue<socket_type>::iterator op_iter = i++;
+      reserve(fd_set_->fd_count + 1);
+      fd_set_->fd_array[fd_set_->fd_count++] = op_iter->first;
+    }
+  }
+
   bool is_set(socket_type descriptor) const
   {
     return !!__WSAFDIsSet(descriptor,
@@ -97,8 +94,14 @@ public:
     return max_descriptor_;
   }
 
-private:
+  void perform(reactor_op_queue<socket_type>& operations,
+      op_queue<operation>& ops) const
+  {
+    for (u_int i = 0; i < fd_set_->fd_count; ++i)
+      operations.perform_operations(fd_set_->fd_array[i], ops);
+  }
 
+private:
   // This structure is defined to be compatible with the Windows API fd_set
   // structure, but without being dependent on the value of FD_SETSIZE. We use
   // the "struct hack" to allow the number of descriptors to be varied at
@@ -109,6 +112,29 @@ private:
     SOCKET fd_array[1];
   };
 
+  // Increase the fd_set_ capacity to at least the specified number of elements.
+  void reserve(u_int n)
+  {
+    if (n <= capacity_)
+      return;
+
+    u_int new_capacity = capacity_ + capacity_ / 2;
+    if (new_capacity < n)
+      new_capacity = n;
+
+    win_fd_set* new_fd_set = static_cast<win_fd_set*>(::operator new(
+          sizeof(win_fd_set) - sizeof(SOCKET)
+          + sizeof(SOCKET) * (new_capacity)));
+
+    new_fd_set->fd_count = fd_set_->fd_count;
+    for (u_int i = 0; i < fd_set_->fd_count; ++i)
+      new_fd_set->fd_array[i] = fd_set_->fd_array[i];
+
+    ::operator delete(fd_set_);
+    fd_set_ = new_fd_set;
+    capacity_ = new_capacity;
+  }
+
   win_fd_set* fd_set_;
   u_int capacity_;
   socket_type max_descriptor_;
@@ -120,6 +146,6 @@ private:
 
 #include <boost/asio/detail/pop_options.hpp>
 
-#endif // defined(BOOST_WINDOWS) || defined(__CYGWIN__)
+#endif // defined(BOOST_ASIO_WINDOWS) || defined(__CYGWIN__)
 
 #endif // BOOST_ASIO_DETAIL_WIN_FD_SET_ADAPTER_HPP