]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/boost/boost/asio/detail/work_dispatcher.hpp
import quincy beta 17.1.0
[ceph.git] / ceph / src / boost / boost / asio / detail / work_dispatcher.hpp
index 3416ead2967f5f754d641b92b2247b2d598f1e4a..f45a16e4fe0b0703be699bf51a5f23eaa558629f 100644 (file)
 #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
 
 #include <boost/asio/detail/config.hpp>
+#include <boost/asio/detail/type_traits.hpp>
 #include <boost/asio/associated_executor.hpp>
 #include <boost/asio/associated_allocator.hpp>
 #include <boost/asio/executor_work_guard.hpp>
+#include <boost/asio/execution/executor.hpp>
+#include <boost/asio/execution/allocator.hpp>
+#include <boost/asio/execution/blocking.hpp>
+#include <boost/asio/execution/outstanding_work.hpp>
+#include <boost/asio/prefer.hpp>
 
 #include <boost/asio/detail/push_options.hpp>
 
@@ -26,13 +32,81 @@ namespace boost {
 namespace asio {
 namespace detail {
 
-template <typename Handler>
+template <typename Handler, typename Executor, typename = void>
+struct is_work_dispatcher_required : true_type
+{
+};
+
+template <typename Handler, typename Executor>
+struct is_work_dispatcher_required<Handler, Executor,
+    typename enable_if<
+      is_same<
+        typename associated_executor<Handler,
+          Executor>::asio_associated_executor_is_unspecialised,
+        void
+      >::value
+    >::type> : false_type
+{
+};
+
+template <typename Handler, typename Executor, typename = void>
 class work_dispatcher
 {
 public:
   template <typename CompletionHandler>
-  explicit work_dispatcher(BOOST_ASIO_MOVE_ARG(CompletionHandler) handler)
-    : work_((get_associated_executor)(handler)),
+  work_dispatcher(BOOST_ASIO_MOVE_ARG(CompletionHandler) handler,
+      const Executor& handler_ex)
+    : handler_(BOOST_ASIO_MOVE_CAST(CompletionHandler)(handler)),
+      executor_(boost::asio::prefer(handler_ex,
+          execution::outstanding_work.tracked))
+  {
+  }
+
+#if defined(BOOST_ASIO_HAS_MOVE)
+  work_dispatcher(const work_dispatcher& other)
+    : handler_(other.handler_),
+      executor_(other.executor_)
+  {
+  }
+
+  work_dispatcher(work_dispatcher&& other)
+    : handler_(BOOST_ASIO_MOVE_CAST(Handler)(other.handler_)),
+      executor_(BOOST_ASIO_MOVE_CAST(work_executor_type)(other.executor_))
+  {
+  }
+#endif // defined(BOOST_ASIO_HAS_MOVE)
+
+  void operator()()
+  {
+    execution::execute(
+        boost::asio::prefer(executor_,
+          execution::blocking.possibly,
+          execution::allocator((get_associated_allocator)(handler_))),
+        BOOST_ASIO_MOVE_CAST(Handler)(handler_));
+  }
+
+private:
+  typedef typename decay<
+      typename prefer_result<const Executor&,
+        execution::outstanding_work_t::tracked_t
+      >::type
+    >::type work_executor_type;
+
+  Handler handler_;
+  work_executor_type executor_;
+};
+
+#if !defined(BOOST_ASIO_NO_TS_EXECUTORS)
+
+template <typename Handler, typename Executor>
+class work_dispatcher<Handler, Executor,
+    typename enable_if<!execution::is_executor<Executor>::value>::type>
+{
+public:
+  template <typename CompletionHandler>
+  work_dispatcher(BOOST_ASIO_MOVE_ARG(CompletionHandler) handler,
+      const Executor& handler_ex)
+    : work_(handler_ex),
       handler_(BOOST_ASIO_MOVE_CAST(CompletionHandler)(handler))
   {
   }
@@ -45,8 +119,7 @@ public:
   }
 
   work_dispatcher(work_dispatcher&& other)
-    : work_(BOOST_ASIO_MOVE_CAST(executor_work_guard<
-        typename associated_executor<Handler>::type>)(other.work_)),
+    : work_(BOOST_ASIO_MOVE_CAST(executor_work_guard<Executor>)(other.work_)),
       handler_(BOOST_ASIO_MOVE_CAST(Handler)(other.handler_))
   {
   }
@@ -62,10 +135,12 @@ public:
   }
 
 private:
-  executor_work_guard<typename associated_executor<Handler>::type> work_;
+  executor_work_guard<Executor> work_;
   Handler handler_;
 };
 
+#endif // !defined(BOOST_ASIO_NO_TS_EXECUTORS)
+
 } // namespace detail
 } // namespace asio
 } // namespace boost