summaryrefslogtreecommitdiff
path: root/boost/process/detail/windows
diff options
context:
space:
mode:
Diffstat (limited to 'boost/process/detail/windows')
-rw-r--r--boost/process/detail/windows/asio_fwd.hpp12
-rw-r--r--boost/process/detail/windows/async_in.hpp18
-rw-r--r--boost/process/detail/windows/async_out.hpp34
-rw-r--r--boost/process/detail/windows/async_pipe.hpp29
-rw-r--r--boost/process/detail/windows/basic_pipe.hpp7
-rw-r--r--boost/process/detail/windows/io_context_ref.hpp8
-rw-r--r--boost/process/detail/windows/on_exit.hpp6
-rw-r--r--boost/process/detail/windows/wait_group.hpp2
8 files changed, 65 insertions, 51 deletions
diff --git a/boost/process/detail/windows/asio_fwd.hpp b/boost/process/detail/windows/asio_fwd.hpp
index 0c388548fc..8c70998039 100644
--- a/boost/process/detail/windows/asio_fwd.hpp
+++ b/boost/process/detail/windows/asio_fwd.hpp
@@ -21,6 +21,9 @@ class basic_streambuf;
typedef basic_streambuf<std::allocator<char>> streambuf;
class io_context;
+class executor;
+
+
template <typename Handler>
class basic_yield_context;
@@ -34,7 +37,10 @@ class basic_stream_handle;
typedef basic_stream_handle<stream_handle_service> stream_handle;
#else /* defined(BOOST_ASIO_ENABLE_OLD_SERVICES) */
-class stream_handle;
+template <typename Executor>
+class basic_stream_handle;
+typedef basic_stream_handle<executor> stream_handle;
+
#endif /* defined(BOOST_ASIO_ENABLE_OLD_SERVICES) */
@@ -46,7 +52,9 @@ class basic_object_handle;
typedef basic_object_handle<object_handle_service> object_handle;
#else /* defined(BOOST_ASIO_ENABLE_OLD_SERVICES) */
-class object_handle;
+template <typename Executor>
+class basic_object_handle;
+typedef basic_object_handle<executor> object_handle;
#endif /* defined(BOOST_ASIO_ENABLE_OLD_SERVICES) */
} //windows
diff --git a/boost/process/detail/windows/async_in.hpp b/boost/process/detail/windows/async_in.hpp
index fc38dcdc34..2a758337b8 100644
--- a/boost/process/detail/windows/async_in.hpp
+++ b/boost/process/detail/windows/async_in.hpp
@@ -48,28 +48,28 @@ struct async_in_buffer : ::boost::process::detail::windows::handler_base_ext,
template <typename Executor>
inline void on_success(Executor&)
{
- auto pipe = this->pipe;
+ auto pipe_ = this->pipe;
if (this->promise)
{
- auto promise = this->promise;
+ auto promise_ = this->promise;
- boost::asio::async_write(*pipe, buf,
- [promise](const boost::system::error_code & ec, std::size_t)
+ boost::asio::async_write(*pipe_, buf,
+ [promise_](const boost::system::error_code & ec, std::size_t)
{
if (ec && (ec.value() != ::boost::winapi::ERROR_BROKEN_PIPE_))
{
std::error_code e(ec.value(), std::system_category());
- promise->set_exception(std::make_exception_ptr(process_error(e)));
+ promise_->set_exception(std::make_exception_ptr(process_error(e)));
}
- promise->set_value();
+ promise_->set_value();
});
}
else
- boost::asio::async_write(*pipe, buf,
- [pipe](const boost::system::error_code&, std::size_t){});
+ boost::asio::async_write(*pipe_, buf,
+ [pipe_](const boost::system::error_code&, std::size_t){});
- std::move(*pipe).source().close();
+ std::move(*pipe_).source().close();
this->pipe = nullptr;
diff --git a/boost/process/detail/windows/async_out.hpp b/boost/process/detail/windows/async_out.hpp
index 6bcb5e82ae..525cbafef0 100644
--- a/boost/process/detail/windows/async_out.hpp
+++ b/boost/process/detail/windows/async_out.hpp
@@ -80,10 +80,10 @@ struct async_out_buffer : ::boost::process::detail::windows::handler_base_ext,
template <typename Executor>
inline void on_success(Executor&)
{
- auto pipe = this->pipe;
- boost::asio::async_read(*pipe, buf,
- [pipe](const boost::system::error_code&, std::size_t){});
- std::move(*pipe).sink().close();
+ auto pipe_ = this->pipe;
+ boost::asio::async_read(*pipe_, buf,
+ [pipe_](const boost::system::error_code&, std::size_t){});
+ std::move(*pipe_).sink().close();
this->pipe = nullptr;
}
@@ -122,34 +122,34 @@ struct async_out_future : ::boost::process::detail::windows::handler_base_ext,
template <typename Executor>
inline void on_success(Executor&)
{
- auto pipe = this->pipe;
- auto buffer = this->buffer;
- auto promise = this->promise;
- std::move(*pipe).sink().close();
- boost::asio::async_read(*pipe, *buffer,
- [pipe, buffer, promise](const boost::system::error_code& ec, std::size_t)
+ auto pipe_ = this->pipe;
+ auto buffer_ = this->buffer;
+ auto promise_ = this->promise;
+ std::move(*pipe_).sink().close();
+ boost::asio::async_read(*pipe_, *buffer_,
+ [pipe_, buffer_, promise_](const boost::system::error_code& ec, std::size_t)
{
if (ec && (ec.value() != ::boost::winapi::ERROR_BROKEN_PIPE_))
{
std::error_code e(ec.value(), std::system_category());
- promise->set_exception(std::make_exception_ptr(process_error(e)));
+ promise_->set_exception(std::make_exception_ptr(process_error(e)));
}
else
{
- std::istream is (buffer.get());
+ std::istream is (buffer_.get());
Type arg;
- if (buffer->size() > 0)
+ if (buffer_->size() > 0)
{
- arg.resize(buffer->size());
- is.read(&*arg.begin(), buffer->size());
+ arg.resize(buffer_->size());
+ is.read(&*arg.begin(), buffer_->size());
}
- promise->set_value(std::move(arg));
+ promise_->set_value(std::move(arg));
}
});
- this->pipe = nullptr;
+ this->pipe = nullptr;
this->buffer = nullptr;
this->promise = nullptr;
diff --git a/boost/process/detail/windows/async_pipe.hpp b/boost/process/detail/windows/async_pipe.hpp
index 746d5a28f7..f06653962a 100644
--- a/boost/process/detail/windows/async_pipe.hpp
+++ b/boost/process/detail/windows/async_pipe.hpp
@@ -14,6 +14,7 @@
#include <boost/winapi/access_rights.hpp>
#include <boost/winapi/process.hpp>
#include <boost/process/detail/windows/basic_pipe.hpp>
+#include <boost/asio/post.hpp>
#include <boost/asio/windows/stream_handle.hpp>
#include <atomic>
#include <system_error>
@@ -99,12 +100,12 @@ public:
if (_sink.is_open())
{
_sink.close();
- _sink = handle_type(_sink.get_io_context());
+ _sink = handle_type(_sink.get_executor());
}
if (_source.is_open())
{
_source.close();
- _source = handle_type(_source.get_io_context());
+ _source = handle_type(_source.get_executor());
}
}
void close(boost::system::error_code & ec)
@@ -112,12 +113,12 @@ public:
if (_sink.is_open())
{
_sink.close(ec);
- _sink = handle_type(_sink.get_io_context());
+ _sink = handle_type(_sink.get_executor());
}
if (_source.is_open())
{
_source.close(ec);
- _source = handle_type(_source.get_io_context());
+ _source = handle_type(_source.get_executor());
}
}
@@ -128,9 +129,9 @@ public:
void async_close()
{
if (_sink.is_open())
- _sink.get_io_context(). post([this]{_sink.close();});
+ boost::asio::post(_sink.get_executor(), [this]{_sink.close();});
if (_source.is_open())
- _source.get_io_context().post([this]{_source.close();});
+ boost::asio::post(_source.get_executor(), [this]{_source.close();});
}
template<typename MutableBufferSequence>
@@ -189,13 +190,13 @@ public:
handle_type source(::boost::asio::io_context& ios) &&
{
- ::boost::asio::windows::stream_handle stolen(ios, _source.native_handle());
+ ::boost::asio::windows::stream_handle stolen(ios.get_executor(), _source.native_handle());
_source.assign(::boost::winapi::INVALID_HANDLE_VALUE_);
return stolen;
}
handle_type sink (::boost::asio::io_context& ios) &&
{
- ::boost::asio::windows::stream_handle stolen(ios, _sink.native_handle());
+ ::boost::asio::windows::stream_handle stolen(ios.get_executor(), _sink.native_handle());
_sink.assign(::boost::winapi::INVALID_HANDLE_VALUE_);
return stolen;
}
@@ -214,7 +215,7 @@ public:
::boost::winapi::DUPLICATE_SAME_ACCESS_))
throw_last_error("Duplicate Pipe Failed");
- return ::boost::asio::windows::stream_handle(ios, source);
+ return ::boost::asio::windows::stream_handle(ios.get_executor(), source);
}
handle_type sink (::boost::asio::io_context& ios) const &
{
@@ -230,15 +231,15 @@ public:
::boost::winapi::DUPLICATE_SAME_ACCESS_))
throw_last_error("Duplicate Pipe Failed");
- return ::boost::asio::windows::stream_handle(ios, sink);
+ return ::boost::asio::windows::stream_handle(ios.get_executor(), sink);
}
};
async_pipe::async_pipe(const async_pipe& p) :
- _source(const_cast<handle_type&>(p._source).get_io_context()),
- _sink (const_cast<handle_type&>(p._sink).get_io_context())
+ _source(const_cast<handle_type&>(p._source).get_executor()),
+ _sink (const_cast<handle_type&>(p._sink).get_executor())
{
auto proc = ::boost::winapi::GetCurrentProcess();
@@ -337,8 +338,8 @@ async_pipe& async_pipe::operator=(const async_pipe & p)
throw_last_error("Duplicate Pipe Failed");
//so we also assign the io_context
- _source = ::boost::asio::windows::stream_handle(source_in.get_io_context(), source);
- _sink = ::boost::asio::windows::stream_handle(source_in.get_io_context(), sink);
+ _source = ::boost::asio::windows::stream_handle(source_in.get_executor(), source);
+ _sink = ::boost::asio::windows::stream_handle(source_in.get_executor(), sink);
return *this;
}
diff --git a/boost/process/detail/windows/basic_pipe.hpp b/boost/process/detail/windows/basic_pipe.hpp
index ca691c078e..28f5651d75 100644
--- a/boost/process/detail/windows/basic_pipe.hpp
+++ b/boost/process/detail/windows/basic_pipe.hpp
@@ -143,8 +143,13 @@ basic_pipe<Char, Traits>::basic_pipe(const std::string & name)
static constexpr int FILE_FLAG_OVERLAPPED_ = 0x40000000; //temporary
//static constexpr int FILE_ATTRIBUTE_NORMAL_ = 0x00000080; //temporary
+#if BOOST_NO_ANSI_APIS
+ std::wstring name_ = boost::process::detail::convert(name);
+#else
+ auto &name_ = name;
+#endif
::boost::winapi::HANDLE_ source = ::boost::winapi::create_named_pipe(
- name.c_str(),
+ name_.c_str(),
::boost::winapi::PIPE_ACCESS_INBOUND_
| FILE_FLAG_OVERLAPPED_, //write flag
0, 1, 8192, 8192, 0, nullptr);
diff --git a/boost/process/detail/windows/io_context_ref.hpp b/boost/process/detail/windows/io_context_ref.hpp
index 903ef0a09f..783c3179e4 100644
--- a/boost/process/detail/windows/io_context_ref.hpp
+++ b/boost/process/detail/windows/io_context_ref.hpp
@@ -3,8 +3,8 @@
// 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 BOOST_PROCESS_WINDOWS_IO_SERVICE_REF_HPP_
-#define BOOST_PROCESS_WINDOWS_IO_SERVICE_REF_HPP_
+#ifndef BOOST_PROCESS_WINDOWS_IO_CONTEXT_REF_HPP_
+#define BOOST_PROCESS_WINDOWS_IO_CONTEXT_REF_HPP_
#include <boost/process/detail/handler_base.hpp>
#include <boost/process/detail/windows/async_handler.hpp>
@@ -130,7 +130,7 @@ struct io_context_ref : boost::process::detail::handler_base
boost::asio::io_context & ios, void * handle,
const std::shared_ptr<std::atomic<int>> &exit_status)
: funcs(std::move(funcs)),
- handle(new boost::asio::windows::object_handle(ios, handle)),
+ handle(new boost::asio::windows::object_handle(ios.get_executor(), handle)),
exit_status(exit_status)
{
@@ -157,4 +157,4 @@ private:
}}}}
-#endif /* BOOST_PROCESS_WINDOWS_IO_SERVICE_REF_HPP_ */
+#endif /* BOOST_PROCESS_WINDOWS_IO_CONTEXT_REF_HPP_ */
diff --git a/boost/process/detail/windows/on_exit.hpp b/boost/process/detail/windows/on_exit.hpp
index 92517cb83c..227485c489 100644
--- a/boost/process/detail/windows/on_exit.hpp
+++ b/boost/process/detail/windows/on_exit.hpp
@@ -25,10 +25,10 @@ struct on_exit_ : boost::process::detail::windows::async_handler
template<typename Executor>
std::function<void(int, const std::error_code&)> on_exit_handler(Executor&)
{
- auto handler = this->handler;
- return [handler](int exit_code, const std::error_code & ec)
+ auto handler_ = this->handler;
+ return [handler_](int exit_code, const std::error_code & ec)
{
- handler(static_cast<int>(exit_code), ec);
+ handler_(static_cast<int>(exit_code), ec);
};
}
diff --git a/boost/process/detail/windows/wait_group.hpp b/boost/process/detail/windows/wait_group.hpp
index 6dca466d83..33e353f998 100644
--- a/boost/process/detail/windows/wait_group.hpp
+++ b/boost/process/detail/windows/wait_group.hpp
@@ -17,7 +17,7 @@ namespace boost { namespace process { namespace detail { namespace windows {
struct group_handle;
-inline bool wait_impl(const group_handle & p, std::error_code & ec, int wait_time)
+inline bool wait_impl(const group_handle & p, std::error_code & ec, std::chrono::system_clock::rep wait_time)
{
::boost::winapi::DWORD_ completion_code;
::boost::winapi::ULONG_PTR_ completion_key;