diff options
Diffstat (limited to 'boost/process/detail/windows/async_pipe.hpp')
-rw-r--r-- | boost/process/detail/windows/async_pipe.hpp | 233 |
1 files changed, 116 insertions, 117 deletions
diff --git a/boost/process/detail/windows/async_pipe.hpp b/boost/process/detail/windows/async_pipe.hpp index ca4f3559d0..6cae1a584f 100644 --- a/boost/process/detail/windows/async_pipe.hpp +++ b/boost/process/detail/windows/async_pipe.hpp @@ -6,15 +6,16 @@ #ifndef BOOST_PROCESS_DETAIL_WINDOWS_ASYNC_PIPE_HPP_ #define BOOST_PROCESS_DETAIL_WINDOWS_ASYNC_PIPE_HPP_ -#include <boost/detail/winapi/basic_types.hpp> -#include <boost/detail/winapi/pipes.hpp> -#include <boost/detail/winapi/handles.hpp> -#include <boost/detail/winapi/file_management.hpp> -#include <boost/detail/winapi/get_last_error.hpp> -#include <boost/detail/winapi/access_rights.hpp> -#include <boost/detail/winapi/process.hpp> +#include <boost/winapi/basic_types.hpp> +#include <boost/winapi/pipes.hpp> +#include <boost/winapi/handles.hpp> +#include <boost/winapi/file_management.hpp> +#include <boost/winapi/get_last_error.hpp> +#include <boost/winapi/access_rights.hpp> +#include <boost/winapi/process.hpp> #include <boost/process/detail/windows/basic_pipe.hpp> #include <boost/asio/windows/stream_handle.hpp> +#include <atomic> #include <system_error> #include <string> @@ -24,9 +25,9 @@ inline std::string make_pipe_name() { std::string name = "\\\\.\\pipe\\boost_process_auto_pipe_"; - auto pid = ::boost::detail::winapi::GetCurrentProcessId(); + auto pid = ::boost::winapi::GetCurrentProcessId(); - static unsigned long long cnt = 0; + static std::atomic_size_t cnt = 0; name += std::to_string(pid); name += "_"; name += std::to_string(cnt++); @@ -39,33 +40,33 @@ class async_pipe ::boost::asio::windows::stream_handle _source; ::boost::asio::windows::stream_handle _sink ; public: - typedef ::boost::detail::winapi::HANDLE_ native_handle_type; + typedef ::boost::winapi::HANDLE_ native_handle_type; typedef ::boost::asio::windows::stream_handle handle_type; - inline async_pipe(boost::asio::io_service & ios, + inline async_pipe(boost::asio::io_context & ios, const std::string & name = make_pipe_name()) : async_pipe(ios, ios, name) {} - inline async_pipe(boost::asio::io_service & ios_source, - boost::asio::io_service & ios_sink, + inline async_pipe(boost::asio::io_context & ios_source, + boost::asio::io_context & ios_sink, const std::string & name = make_pipe_name()); inline async_pipe(const async_pipe& rhs); async_pipe(async_pipe&& rhs) : _source(std::move(rhs._source)), _sink(std::move(rhs._sink)) { - rhs._source.assign (::boost::detail::winapi::INVALID_HANDLE_VALUE_); - rhs._sink .assign (::boost::detail::winapi::INVALID_HANDLE_VALUE_); + rhs._source.assign (::boost::winapi::INVALID_HANDLE_VALUE_); + rhs._sink .assign (::boost::winapi::INVALID_HANDLE_VALUE_); } template<class CharT, class Traits = std::char_traits<CharT>> - explicit async_pipe(::boost::asio::io_service & ios_source, - ::boost::asio::io_service & ios_sink, + explicit async_pipe(::boost::asio::io_context & ios_source, + ::boost::asio::io_context & ios_sink, const basic_pipe<CharT, Traits> & p) : _source(ios_source, p.native_source()), _sink(ios_sink, p.native_sink()) { } template<class CharT, class Traits = std::char_traits<CharT>> - explicit async_pipe(boost::asio::io_service & ios, const basic_pipe<CharT, Traits> & p) + explicit async_pipe(boost::asio::io_context & ios, const basic_pipe<CharT, Traits> & p) : async_pipe(ios, ios, p) { } @@ -78,10 +79,8 @@ public: ~async_pipe() { - if (_sink .native() != ::boost::detail::winapi::INVALID_HANDLE_VALUE_) - ::boost::detail::winapi::CloseHandle(_sink.native()); - if (_source.native() != ::boost::detail::winapi::INVALID_HANDLE_VALUE_) - ::boost::detail::winapi::CloseHandle(_source.native()); + boost::system::error_code ec; + close(ec); } template<class CharT, class Traits = std::char_traits<CharT>> @@ -100,12 +99,12 @@ public: if (_sink.is_open()) { _sink.close(); - _sink = handle_type(_sink.get_io_service()); + _sink = handle_type(_sink.get_io_context()); } if (_source.is_open()) { _source.close(); - _source = handle_type(_source.get_io_service()); + _source = handle_type(_source.get_io_context()); } } void close(boost::system::error_code & ec) @@ -113,12 +112,12 @@ public: if (_sink.is_open()) { _sink.close(ec); - _sink = handle_type(_sink.get_io_service()); + _sink = handle_type(_sink.get_io_context()); } if (_source.is_open()) { _source.close(ec); - _source = handle_type(_source.get_io_service()); + _source = handle_type(_source.get_io_context()); } } @@ -129,9 +128,9 @@ public: void async_close() { if (_sink.is_open()) - _sink.get_io_service(). post([this]{_sink.close();}); + _sink.get_io_context(). post([this]{_sink.close();}); if (_source.is_open()) - _source.get_io_service().post([this]{_source.close();}); + _source.get_io_context().post([this]{_source.close();}); } template<typename MutableBufferSequence> @@ -145,8 +144,8 @@ public: return _sink.write_some(buffers); } - native_handle_type native_source() const {return const_cast<boost::asio::windows::stream_handle&>(_source).native();} - native_handle_type native_sink () const {return const_cast<boost::asio::windows::stream_handle&>(_sink ).native();} + native_handle_type native_source() const {return const_cast<boost::asio::windows::stream_handle&>(_source).native_handle();} + native_handle_type native_sink () const {return const_cast<boost::asio::windows::stream_handle&>(_sink ).native_handle();} template<typename MutableBufferSequence, typename ReadHandler> @@ -176,47 +175,47 @@ public: handle_type && source() && { return std::move(_source); } handle_type && sink() && { return std::move(_sink); } - handle_type source(::boost::asio::io_service& ios) && + handle_type source(::boost::asio::io_context& ios) && { ::boost::asio::windows::stream_handle stolen(ios, _source.native_handle()); - _source.assign(::boost::detail::winapi::INVALID_HANDLE_VALUE_); + _source.assign(::boost::winapi::INVALID_HANDLE_VALUE_); return stolen; } - handle_type sink (::boost::asio::io_service& ios) && + handle_type sink (::boost::asio::io_context& ios) && { ::boost::asio::windows::stream_handle stolen(ios, _sink.native_handle()); - _sink.assign(::boost::detail::winapi::INVALID_HANDLE_VALUE_); + _sink.assign(::boost::winapi::INVALID_HANDLE_VALUE_); return stolen; } - handle_type source(::boost::asio::io_service& ios) const & + handle_type source(::boost::asio::io_context& ios) const & { - auto proc = ::boost::detail::winapi::GetCurrentProcess(); + auto proc = ::boost::winapi::GetCurrentProcess(); - ::boost::detail::winapi::HANDLE_ source; - auto source_in = const_cast<handle_type&>(_source).native(); - if (source_in == ::boost::detail::winapi::INVALID_HANDLE_VALUE_) - source = ::boost::detail::winapi::INVALID_HANDLE_VALUE_; - else if (!::boost::detail::winapi::DuplicateHandle( + ::boost::winapi::HANDLE_ source; + auto source_in = const_cast<handle_type&>(_source).native_handle(); + if (source_in == ::boost::winapi::INVALID_HANDLE_VALUE_) + source = ::boost::winapi::INVALID_HANDLE_VALUE_; + else if (!::boost::winapi::DuplicateHandle( proc, source_in, proc, &source, 0, - static_cast<::boost::detail::winapi::BOOL_>(true), - ::boost::detail::winapi::DUPLICATE_SAME_ACCESS_)) + static_cast<::boost::winapi::BOOL_>(true), + ::boost::winapi::DUPLICATE_SAME_ACCESS_)) throw_last_error("Duplicate Pipe Failed"); return ::boost::asio::windows::stream_handle(ios, source); } - handle_type sink (::boost::asio::io_service& ios) const & + handle_type sink (::boost::asio::io_context& ios) const & { - auto proc = ::boost::detail::winapi::GetCurrentProcess(); + auto proc = ::boost::winapi::GetCurrentProcess(); - ::boost::detail::winapi::HANDLE_ sink; - auto sink_in = const_cast<handle_type&>(_sink).native(); - if (sink_in == ::boost::detail::winapi::INVALID_HANDLE_VALUE_) - sink = ::boost::detail::winapi::INVALID_HANDLE_VALUE_; - else if (!::boost::detail::winapi::DuplicateHandle( + ::boost::winapi::HANDLE_ sink; + auto sink_in = const_cast<handle_type&>(_sink).native_handle(); + if (sink_in == ::boost::winapi::INVALID_HANDLE_VALUE_) + sink = ::boost::winapi::INVALID_HANDLE_VALUE_; + else if (!::boost::winapi::DuplicateHandle( proc, sink_in, proc, &sink, 0, - static_cast<::boost::detail::winapi::BOOL_>(true), - ::boost::detail::winapi::DUPLICATE_SAME_ACCESS_)) + static_cast<::boost::winapi::BOOL_>(true), + ::boost::winapi::DUPLICATE_SAME_ACCESS_)) throw_last_error("Duplicate Pipe Failed"); return ::boost::asio::windows::stream_handle(ios, sink); @@ -226,32 +225,32 @@ public: async_pipe::async_pipe(const async_pipe& p) : - _source(const_cast<handle_type&>(p._source).get_io_service()), - _sink (const_cast<handle_type&>(p._sink).get_io_service()) + _source(const_cast<handle_type&>(p._source).get_io_context()), + _sink (const_cast<handle_type&>(p._sink).get_io_context()) { - auto proc = ::boost::detail::winapi::GetCurrentProcess(); + auto proc = ::boost::winapi::GetCurrentProcess(); - ::boost::detail::winapi::HANDLE_ source; - ::boost::detail::winapi::HANDLE_ sink; + ::boost::winapi::HANDLE_ source; + ::boost::winapi::HANDLE_ sink; //cannot get the handle from a const object. - auto source_in = const_cast<handle_type&>(p._source).native(); - auto sink_in = const_cast<handle_type&>(p._sink).native(); + auto source_in = const_cast<handle_type&>(p._source).native_handle(); + auto sink_in = const_cast<handle_type&>(p._sink).native_handle(); - if (source_in == ::boost::detail::winapi::INVALID_HANDLE_VALUE_) - source = ::boost::detail::winapi::INVALID_HANDLE_VALUE_; - else if (!::boost::detail::winapi::DuplicateHandle( + if (source_in == ::boost::winapi::INVALID_HANDLE_VALUE_) + source = ::boost::winapi::INVALID_HANDLE_VALUE_; + else if (!::boost::winapi::DuplicateHandle( proc, source_in, proc, &source, 0, - static_cast<::boost::detail::winapi::BOOL_>(true), - ::boost::detail::winapi::DUPLICATE_SAME_ACCESS_)) + static_cast<::boost::winapi::BOOL_>(true), + ::boost::winapi::DUPLICATE_SAME_ACCESS_)) throw_last_error("Duplicate Pipe Failed"); - if (sink_in == ::boost::detail::winapi::INVALID_HANDLE_VALUE_) - sink = ::boost::detail::winapi::INVALID_HANDLE_VALUE_; - else if (!::boost::detail::winapi::DuplicateHandle( + if (sink_in == ::boost::winapi::INVALID_HANDLE_VALUE_) + sink = ::boost::winapi::INVALID_HANDLE_VALUE_; + else if (!::boost::winapi::DuplicateHandle( proc, sink_in, proc, &sink, 0, - static_cast<::boost::detail::winapi::BOOL_>(true), - ::boost::detail::winapi::DUPLICATE_SAME_ACCESS_)) + static_cast<::boost::winapi::BOOL_>(true), + ::boost::winapi::DUPLICATE_SAME_ACCESS_)) throw_last_error("Duplicate Pipe Failed"); _source.assign(source); @@ -259,32 +258,32 @@ async_pipe::async_pipe(const async_pipe& p) : } -async_pipe::async_pipe(boost::asio::io_service & ios_source, - boost::asio::io_service & ios_sink, +async_pipe::async_pipe(boost::asio::io_context & ios_source, + boost::asio::io_context & ios_sink, const std::string & name) : _source(ios_source), _sink(ios_sink) { static constexpr int FILE_FLAG_OVERLAPPED_ = 0x40000000; //temporary - ::boost::detail::winapi::HANDLE_ source = ::boost::detail::winapi::create_named_pipe( + ::boost::winapi::HANDLE_ source = ::boost::winapi::create_named_pipe( name.c_str(), - ::boost::detail::winapi::PIPE_ACCESS_INBOUND_ + ::boost::winapi::PIPE_ACCESS_INBOUND_ | FILE_FLAG_OVERLAPPED_, //write flag 0, 1, 8192, 8192, 0, nullptr); - if (source == boost::detail::winapi::INVALID_HANDLE_VALUE_) + if (source == boost::winapi::INVALID_HANDLE_VALUE_) ::boost::process::detail::throw_last_error("create_named_pipe(" + name + ") failed"); _source.assign(source); - ::boost::detail::winapi::HANDLE_ sink = boost::detail::winapi::create_file( + ::boost::winapi::HANDLE_ sink = boost::winapi::create_file( name.c_str(), - ::boost::detail::winapi::GENERIC_WRITE_, 0, nullptr, - ::boost::detail::winapi::OPEN_EXISTING_, + ::boost::winapi::GENERIC_WRITE_, 0, nullptr, + ::boost::winapi::OPEN_EXISTING_, FILE_FLAG_OVERLAPPED_, //to allow read nullptr); - if (sink == ::boost::detail::winapi::INVALID_HANDLE_VALUE_) + if (sink == ::boost::winapi::INVALID_HANDLE_VALUE_) ::boost::process::detail::throw_last_error("create_file() failed"); _sink.assign(sink); @@ -292,79 +291,79 @@ async_pipe::async_pipe(boost::asio::io_service & ios_source, async_pipe& async_pipe::operator=(const async_pipe & p) { - auto proc = ::boost::detail::winapi::GetCurrentProcess(); + auto proc = ::boost::winapi::GetCurrentProcess(); - ::boost::detail::winapi::HANDLE_ source; - ::boost::detail::winapi::HANDLE_ sink; + ::boost::winapi::HANDLE_ source; + ::boost::winapi::HANDLE_ sink; //cannot get the handle from a const object. auto &source_in = const_cast<::boost::asio::windows::stream_handle &>(p._source); auto &sink_in = const_cast<::boost::asio::windows::stream_handle &>(p._sink); - if (source_in.native() == ::boost::detail::winapi::INVALID_HANDLE_VALUE_) - source = ::boost::detail::winapi::INVALID_HANDLE_VALUE_; - else if (!::boost::detail::winapi::DuplicateHandle( - proc, source_in.native(), proc, &source, 0, - static_cast<::boost::detail::winapi::BOOL_>(true), - ::boost::detail::winapi::DUPLICATE_SAME_ACCESS_)) + if (source_in.native_handle() == ::boost::winapi::INVALID_HANDLE_VALUE_) + source = ::boost::winapi::INVALID_HANDLE_VALUE_; + else if (!::boost::winapi::DuplicateHandle( + proc, source_in.native_handle(), proc, &source, 0, + static_cast<::boost::winapi::BOOL_>(true), + ::boost::winapi::DUPLICATE_SAME_ACCESS_)) throw_last_error("Duplicate Pipe Failed"); - if (sink_in.native() == ::boost::detail::winapi::INVALID_HANDLE_VALUE_) - sink = ::boost::detail::winapi::INVALID_HANDLE_VALUE_; - else if (!::boost::detail::winapi::DuplicateHandle( - proc, sink_in.native(), proc, &sink, 0, - static_cast<::boost::detail::winapi::BOOL_>(true), - ::boost::detail::winapi::DUPLICATE_SAME_ACCESS_)) + if (sink_in.native_handle() == ::boost::winapi::INVALID_HANDLE_VALUE_) + sink = ::boost::winapi::INVALID_HANDLE_VALUE_; + else if (!::boost::winapi::DuplicateHandle( + proc, sink_in.native_handle(), proc, &sink, 0, + static_cast<::boost::winapi::BOOL_>(true), + ::boost::winapi::DUPLICATE_SAME_ACCESS_)) throw_last_error("Duplicate Pipe Failed"); - //so we also assign the io_service - _source = ::boost::asio::windows::stream_handle(source_in.get_io_service(), source); - _sink = ::boost::asio::windows::stream_handle(source_in.get_io_service(), sink); + //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); return *this; } async_pipe& async_pipe::operator=(async_pipe && rhs) { - if (_source.native_handle() != ::boost::detail::winapi::INVALID_HANDLE_VALUE_) - ::boost::detail::winapi::CloseHandle(_source.native()); + if (_source.native_handle() != ::boost::winapi::INVALID_HANDLE_VALUE_) + ::boost::winapi::CloseHandle(_source.native_handle()); - if (_sink.native_handle() != ::boost::detail::winapi::INVALID_HANDLE_VALUE_) - ::boost::detail::winapi::CloseHandle(_sink.native()); + if (_sink.native_handle() != ::boost::winapi::INVALID_HANDLE_VALUE_) + ::boost::winapi::CloseHandle(_sink.native_handle()); _source.assign(rhs._source.native_handle()); _sink .assign(rhs._sink .native_handle()); - rhs._source.assign(::boost::detail::winapi::INVALID_HANDLE_VALUE_); - rhs._sink .assign(::boost::detail::winapi::INVALID_HANDLE_VALUE_); + rhs._source.assign(::boost::winapi::INVALID_HANDLE_VALUE_); + rhs._sink .assign(::boost::winapi::INVALID_HANDLE_VALUE_); return *this; } template<class CharT, class Traits> async_pipe::operator basic_pipe<CharT, Traits>() const { - auto proc = ::boost::detail::winapi::GetCurrentProcess(); + auto proc = ::boost::winapi::GetCurrentProcess(); - ::boost::detail::winapi::HANDLE_ source; - ::boost::detail::winapi::HANDLE_ sink; + ::boost::winapi::HANDLE_ source; + ::boost::winapi::HANDLE_ sink; //cannot get the handle from a const object. - auto source_in = const_cast<::boost::asio::windows::stream_handle &>(_source).native(); - auto sink_in = const_cast<::boost::asio::windows::stream_handle &>(_sink).native(); + auto source_in = const_cast<::boost::asio::windows::stream_handle &>(_source).native_handle(); + auto sink_in = const_cast<::boost::asio::windows::stream_handle &>(_sink).native_handle(); - if (source_in == ::boost::detail::winapi::INVALID_HANDLE_VALUE_) - source = ::boost::detail::winapi::INVALID_HANDLE_VALUE_; - else if (!::boost::detail::winapi::DuplicateHandle( + if (source_in == ::boost::winapi::INVALID_HANDLE_VALUE_) + source = ::boost::winapi::INVALID_HANDLE_VALUE_; + else if (!::boost::winapi::DuplicateHandle( proc, source_in, proc, &source, 0, - static_cast<::boost::detail::winapi::BOOL_>(true), - ::boost::detail::winapi::DUPLICATE_SAME_ACCESS_)) + static_cast<::boost::winapi::BOOL_>(true), + ::boost::winapi::DUPLICATE_SAME_ACCESS_)) throw_last_error("Duplicate Pipe Failed"); - if (sink_in == ::boost::detail::winapi::INVALID_HANDLE_VALUE_) - sink = ::boost::detail::winapi::INVALID_HANDLE_VALUE_; - else if (!::boost::detail::winapi::DuplicateHandle( + if (sink_in == ::boost::winapi::INVALID_HANDLE_VALUE_) + sink = ::boost::winapi::INVALID_HANDLE_VALUE_; + else if (!::boost::winapi::DuplicateHandle( proc, sink_in, proc, &sink, 0, - static_cast<::boost::detail::winapi::BOOL_>(true), - ::boost::detail::winapi::DUPLICATE_SAME_ACCESS_)) + static_cast<::boost::winapi::BOOL_>(true), + ::boost::winapi::DUPLICATE_SAME_ACCESS_)) throw_last_error("Duplicate Pipe Failed"); return basic_pipe<CharT, Traits>{source, sink}; |