src/cxx_supportlib/vendor-modified/boost/asio/impl/awaitable.hpp in passenger-6.0.19 vs src/cxx_supportlib/vendor-modified/boost/asio/impl/awaitable.hpp in passenger-6.0.20

- old
+ new

@@ -1,10 +1,10 @@ // // impl/awaitable.hpp // ~~~~~~~~~~~~~~~~~~ // -// Copyright (c) 2003-2022 Christopher M. Kohlhoff (chris at kohlhoff dot com) +// Copyright (c) 2003-2023 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) // @@ -28,10 +28,16 @@ #include <boost/asio/error.hpp> #include <boost/asio/post.hpp> #include <boost/system/system_error.hpp> #include <boost/asio/this_coro.hpp> +#if defined(BOOST_ASIO_ENABLE_HANDLER_TRACKING) +# if defined(BOOST_ASIO_HAS_SOURCE_LOCATION) +# include <boost/asio/detail/source_location.hpp> +# endif // defined(BOOST_ASIO_HAS_SOURCE_LOCATION) +#endif // defined(BOOST_ASIO_ENABLE_HANDLER_TRACKING) + #include <boost/asio/detail/push_options.hpp> namespace boost { namespace asio { namespace detail { @@ -168,19 +174,31 @@ return a; } template <typename Op> auto await_transform(Op&& op, - typename constraint<is_async_operation<Op>::value>::type = 0) + typename constraint<is_async_operation<Op>::value>::type = 0 +#if defined(BOOST_ASIO_ENABLE_HANDLER_TRACKING) +# if defined(BOOST_ASIO_HAS_SOURCE_LOCATION) + , detail::source_location location = detail::source_location::current() +# endif // defined(BOOST_ASIO_HAS_SOURCE_LOCATION) +#endif // defined(BOOST_ASIO_ENABLE_HANDLER_TRACKING) + ) { if (attached_thread_->entry_point()->throw_if_cancelled_) if (!!attached_thread_->get_cancellation_state().cancelled()) throw_error(boost::asio::error::operation_aborted, "co_await"); return awaitable_async_op<typename completion_signature_of<Op>::type, typename decay<Op>::type, Executor>{ - std::forward<Op>(op), this}; + std::forward<Op>(op), this +#if defined(BOOST_ASIO_ENABLE_HANDLER_TRACKING) +# if defined(BOOST_ASIO_HAS_SOURCE_LOCATION) + , location +# endif // defined(BOOST_ASIO_HAS_SOURCE_LOCATION) +#endif // defined(BOOST_ASIO_ENABLE_HANDLER_TRACKING) + }; } // This await transformation obtains the associated executor of the thread of // execution. auto await_transform(this_coro::executor_t) noexcept @@ -951,11 +969,11 @@ this->pump(); } static T resume(result_type& result) { - if (*result) + if (*result.ex_) { std::exception_ptr ex = std::exchange(*result.ex_, nullptr); std::rethrow_exception(ex); } return std::move(*result.value_); @@ -1066,11 +1084,11 @@ this->pump(); } static std::tuple<Ts...> resume(result_type& result) { - if (*result) + if (*result.ex_) { std::exception_ptr ex = std::exchange(*result.ex_, nullptr); std::rethrow_exception(ex); } return std::move(*result.value_); @@ -1084,14 +1102,25 @@ class awaitable_async_op { public: typedef awaitable_async_op_handler<Signature, Executor> handler_type; - awaitable_async_op(Op&& o, awaitable_frame_base<Executor>* frame) + awaitable_async_op(Op&& o, awaitable_frame_base<Executor>* frame +#if defined(BOOST_ASIO_ENABLE_HANDLER_TRACKING) +# if defined(BOOST_ASIO_HAS_SOURCE_LOCATION) + , const detail::source_location& location +# endif // defined(BOOST_ASIO_HAS_SOURCE_LOCATION) +#endif // defined(BOOST_ASIO_ENABLE_HANDLER_TRACKING) + ) : op_(std::forward<Op>(o)), frame_(frame), result_() +#if defined(BOOST_ASIO_ENABLE_HANDLER_TRACKING) +# if defined(BOOST_ASIO_HAS_SOURCE_LOCATION) + , location_(location) +# endif // defined(BOOST_ASIO_HAS_SOURCE_LOCATION) +#endif // defined(BOOST_ASIO_ENABLE_HANDLER_TRACKING) { } bool await_ready() const noexcept { @@ -1102,10 +1131,16 @@ { frame_->after_suspend( [](void* arg) { awaitable_async_op* self = static_cast<awaitable_async_op*>(arg); +#if defined(BOOST_ASIO_ENABLE_HANDLER_TRACKING) +# if defined(BOOST_ASIO_HAS_SOURCE_LOCATION) + BOOST_ASIO_HANDLER_LOCATION((self->location_.file_name(), + self->location_.line(), self->location_.function_name())); +# endif // defined(BOOST_ASIO_HAS_SOURCE_LOCATION) +#endif // defined(BOOST_ASIO_ENABLE_HANDLER_TRACKING) std::forward<Op&&>(self->op_)( handler_type(self->frame_->detach_thread(), self->result_)); }, this); } @@ -1116,9 +1151,14 @@ private: Op&& op_; awaitable_frame_base<Executor>* frame_; typename handler_type::result_type result_; +#if defined(BOOST_ASIO_ENABLE_HANDLER_TRACKING) +# if defined(BOOST_ASIO_HAS_SOURCE_LOCATION) + detail::source_location location_; +# endif // defined(BOOST_ASIO_HAS_SOURCE_LOCATION) +#endif // defined(BOOST_ASIO_ENABLE_HANDLER_TRACKING) }; } // namespace detail } // namespace asio } // namespace boost