summaryrefslogtreecommitdiffstatshomepage
path: root/3rdparty/asio/include/asio/impl/system_context.ipp
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/asio/include/asio/impl/system_context.ipp')
-rw-r--r--3rdparty/asio/include/asio/impl/system_context.ipp92
1 files changed, 92 insertions, 0 deletions
diff --git a/3rdparty/asio/include/asio/impl/system_context.ipp b/3rdparty/asio/include/asio/impl/system_context.ipp
new file mode 100644
index 00000000000..d12c5747277
--- /dev/null
+++ b/3rdparty/asio/include/asio/impl/system_context.ipp
@@ -0,0 +1,92 @@
+//
+// impl/system_context.ipp
+// ~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2021 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)
+//
+
+#ifndef ASIO_IMPL_SYSTEM_CONTEXT_IPP
+#define ASIO_IMPL_SYSTEM_CONTEXT_IPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+# pragma once
+#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
+
+#include "asio/detail/config.hpp"
+#include "asio/system_context.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+struct system_context::thread_function
+{
+ detail::scheduler* scheduler_;
+
+ void operator()()
+ {
+#if !defined(ASIO_NO_EXCEPTIONS)
+ try
+ {
+#endif// !defined(ASIO_NO_EXCEPTIONS)
+ asio::error_code ec;
+ scheduler_->run(ec);
+#if !defined(ASIO_NO_EXCEPTIONS)
+ }
+ catch (...)
+ {
+ std::terminate();
+ }
+#endif// !defined(ASIO_NO_EXCEPTIONS)
+ }
+};
+
+system_context::system_context()
+ : scheduler_(add_scheduler(new detail::scheduler(*this, 0, false)))
+{
+ scheduler_.work_started();
+
+ thread_function f = { &scheduler_ };
+ num_threads_ = detail::thread::hardware_concurrency() * 2;
+ num_threads_ = num_threads_ ? num_threads_ : 2;
+ threads_.create_threads(f, num_threads_);
+}
+
+system_context::~system_context()
+{
+ scheduler_.work_finished();
+ scheduler_.stop();
+ threads_.join();
+}
+
+void system_context::stop()
+{
+ scheduler_.stop();
+}
+
+bool system_context::stopped() const ASIO_NOEXCEPT
+{
+ return scheduler_.stopped();
+}
+
+void system_context::join()
+{
+ scheduler_.work_finished();
+ threads_.join();
+}
+
+detail::scheduler& system_context::add_scheduler(detail::scheduler* s)
+{
+ detail::scoped_ptr<detail::scheduler> scoped_impl(s);
+ asio::add_service<detail::scheduler>(*this, scoped_impl.get());
+ return *scoped_impl.release();
+}
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_IMPL_SYSTEM_CONTEXT_IPP