/usr/include/boost/asio
NameSizeModeActions
detail/-0755rm
execution/-0755rm
generic/-0755rm
impl/-0755rm
ip/-0755rm
local/-0755rm
posix/-0755rm
ssl/-0755rm
traits/-0755rm
ts/-0755rm
windows/-0755rm
any_io_executor.hpp26250644editdlrm
associated_allocator.hpp37910644editdlrm
associated_executor.hpp50570644editdlrm
async_result.hpp194230644editdlrm
awaitable.hpp32700644editdlrm
basic_datagram_socket.hpp475210644editdlrm
basic_deadline_timer.hpp241580644editdlrm
basic_io_object.hpp80960644editdlrm
basic_raw_socket.hpp469960644editdlrm
basic_seq_packet_socket.hpp291840644editdlrm
basic_serial_port.hpp319120644editdlrm
basic_signal_set.hpp198760644editdlrm
basic_socket.hpp655160644editdlrm
basic_socket_acceptor.hpp880620644editdlrm
basic_socket_iostream.hpp132980644editdlrm
basic_socket_streambuf.hpp217130644editdlrm
basic_streambuf.hpp137140644editdlrm
basic_streambuf_fwd.hpp9200644editdlrm
basic_stream_socket.hpp415200644editdlrm
basic_waitable_timer.hpp285280644editdlrm
bind_executor.hpp165100644editdlrm
buffer.hpp832540644editdlrm
buffered_read_stream.hpp84240644editdlrm
buffered_read_stream_fwd.hpp6990644editdlrm
buffered_stream.hpp90740644editdlrm
buffered_stream_fwd.hpp6690644editdlrm
buffered_write_stream.hpp80420644editdlrm
buffered_write_stream_fwd.hpp7050644editdlrm
buffers_iterator.hpp140490644editdlrm
completion_condition.hpp55000644editdlrm
compose.hpp45960644editdlrm
connect.hpp431570644editdlrm
coroutine.hpp98970644editdlrm
co_spawn.hpp145090644editdlrm
deadline_timer.hpp11380644editdlrm
defer.hpp50700644editdlrm
detached.hpp35170644editdlrm
dispatch.hpp45370644editdlrm
error.hpp103510644editdlrm
execution.hpp18710644editdlrm
execution_context.hpp143410644editdlrm
executor.hpp104670644editdlrm
executor_work_guard.hpp80390644editdlrm
handler_alloc_hook.hpp34710644editdlrm
handler_continuation_hook.hpp14740644editdlrm
handler_invoke_hook.hpp37440644editdlrm
high_resolution_timer.hpp13940644editdlrm
io_context.hpp552260644editdlrm
io_context_strand.hpp137060644editdlrm
io_service.hpp8610644editdlrm
io_service_strand.hpp5750644editdlrm
is_applicable_property.hpp16050644editdlrm
is_executor.hpp13060644editdlrm
is_read_buffered.hpp16460644editdlrm
is_write_buffered.hpp16670644editdlrm
multiple_exceptions.hpp16310644editdlrm
packaged_task.hpp33580644editdlrm
placeholders.hpp41460644editdlrm
post.hpp47600644editdlrm
prefer.hpp188210644editdlrm
query.hpp83230644editdlrm
read.hpp538940644editdlrm
read_at.hpp277660644editdlrm
read_until.hpp1194770644editdlrm
redirect_error.hpp19380644editdlrm
require.hpp149260644editdlrm
require_concept.hpp92180644editdlrm
serial_port.hpp10100644editdlrm
serial_port_base.hpp49750644editdlrm
signal_set.hpp7480644editdlrm
socket_base.hpp159390644editdlrm
spawn.hpp117930644editdlrm
ssl.hpp8480644editdlrm
static_thread_pool.hpp8260644editdlrm
steady_timer.hpp13060644editdlrm
strand.hpp171930644editdlrm
streambuf.hpp8260644editdlrm
system_context.hpp26490644editdlrm
system_executor.hpp225290644editdlrm
system_timer.hpp13060644editdlrm
this_coro.hpp11490644editdlrm
thread_pool.hpp375670644editdlrm
time_traits.hpp22810644editdlrm
unyield.hpp3810644editdlrm
uses_executor.hpp23480644editdlrm
use_awaitable.hpp58210644editdlrm
use_future.hpp48200644editdlrm
version.hpp6860644editdlrm
wait_traits.hpp14510644editdlrm
write.hpp529590644editdlrm
write_at.hpp295140644editdlrm
yield.hpp4820644editdlrm
Edit: /usr/include/boost/asio/spawn.hpp (11793B)
// // spawn.hpp // ~~~~~~~~~ // // Copyright (c) 2003-2020 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 BOOST_ASIO_SPAWN_HPP #define BOOST_ASIO_SPAWN_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include #include #include #include #include #include #include #include #include #include #include namespace boost { namespace asio { /// Context object the represents the currently executing coroutine. /** * The basic_yield_context class is used to represent the currently executing * stackful coroutine. A basic_yield_context may be passed as a handler to an * asynchronous operation. For example: * * @code template * void my_coroutine(basic_yield_context yield) * { * ... * std::size_t n = my_socket.async_read_some(buffer, yield); * ... * } @endcode * * The initiating function (async_read_some in the above example) suspends the * current coroutine. The coroutine is resumed when the asynchronous operation * completes, and the result of the operation is returned. */ template class basic_yield_context { public: /// The coroutine callee type, used by the implementation. /** * When using Boost.Coroutine v1, this type is: * @code typename coroutine @endcode * When using Boost.Coroutine v2 (unidirectional coroutines), this type is: * @code push_coroutine @endcode */ #if defined(GENERATING_DOCUMENTATION) typedef implementation_defined callee_type; #elif defined(BOOST_COROUTINES_UNIDIRECT) || defined(BOOST_COROUTINES_V2) typedef boost::coroutines::push_coroutine callee_type; #else typedef boost::coroutines::coroutine callee_type; #endif /// The coroutine caller type, used by the implementation. /** * When using Boost.Coroutine v1, this type is: * @code typename coroutine::caller_type @endcode * When using Boost.Coroutine v2 (unidirectional coroutines), this type is: * @code pull_coroutine @endcode */ #if defined(GENERATING_DOCUMENTATION) typedef implementation_defined caller_type; #elif defined(BOOST_COROUTINES_UNIDIRECT) || defined(BOOST_COROUTINES_V2) typedef boost::coroutines::pull_coroutine caller_type; #else typedef boost::coroutines::coroutine::caller_type caller_type; #endif /// Construct a yield context to represent the specified coroutine. /** * Most applications do not need to use this constructor. Instead, the * spawn() function passes a yield context as an argument to the coroutine * function. */ basic_yield_context( const detail::weak_ptr& coro, caller_type& ca, Handler& handler) : coro_(coro), ca_(ca), handler_(handler), ec_(0) { } /// Construct a yield context from another yield context type. /** * Requires that OtherHandler be convertible to Handler. */ template basic_yield_context(const basic_yield_context& other) : coro_(other.coro_), ca_(other.ca_), handler_(other.handler_), ec_(other.ec_) { } /// Return a yield context that sets the specified error_code. /** * By default, when a yield context is used with an asynchronous operation, a * non-success error_code is converted to system_error and thrown. This * operator may be used to specify an error_code object that should instead be * set with the asynchronous operation's result. For example: * * @code template * void my_coroutine(basic_yield_context yield) * { * ... * std::size_t n = my_socket.async_read_some(buffer, yield[ec]); * if (ec) * { * // An error occurred. * } * ... * } @endcode */ basic_yield_context operator[](boost::system::error_code& ec) const { basic_yield_context tmp(*this); tmp.ec_ = &ec; return tmp; } #if defined(GENERATING_DOCUMENTATION) private: #endif // defined(GENERATING_DOCUMENTATION) detail::weak_ptr coro_; caller_type& ca_; Handler handler_; boost::system::error_code* ec_; }; #if defined(GENERATING_DOCUMENTATION) /// Context object that represents the currently executing coroutine. typedef basic_yield_context yield_context; #else // defined(GENERATING_DOCUMENTATION) typedef basic_yield_context< executor_binder > yield_context; #endif // defined(GENERATING_DOCUMENTATION) /** * @defgroup spawn boost::asio::spawn * * @brief Start a new stackful coroutine. * * The spawn() function is a high-level wrapper over the Boost.Coroutine * library. This function enables programs to implement asynchronous logic in a * synchronous manner, as illustrated by the following example: * * @code boost::asio::spawn(my_strand, do_echo); * * // ... * * void do_echo(boost::asio::yield_context yield) * { * try * { * char data[128]; * for (;;) * { * std::size_t length = * my_socket.async_read_some( * boost::asio::buffer(data), yield); * * boost::asio::async_write(my_socket, * boost::asio::buffer(data, length), yield); * } * } * catch (std::exception& e) * { * // ... * } * } @endcode */ /*@{*/ /// Start a new stackful coroutine, calling the specified handler when it /// completes. /** * This function is used to launch a new coroutine. * * @param function The coroutine function. The function must have the signature: * @code void function(basic_yield_context yield); @endcode * * @param attributes Boost.Coroutine attributes used to customise the coroutine. */ template void spawn(BOOST_ASIO_MOVE_ARG(Function) function, const boost::coroutines::attributes& attributes = boost::coroutines::attributes()); /// Start a new stackful coroutine, calling the specified handler when it /// completes. /** * This function is used to launch a new coroutine. * * @param handler A handler to be called when the coroutine exits. More * importantly, the handler provides an execution context (via the the handler * invocation hook) for the coroutine. The handler must have the signature: * @code void handler(); @endcode * * @param function The coroutine function. The function must have the signature: * @code void function(basic_yield_context yield); @endcode * * @param attributes Boost.Coroutine attributes used to customise the coroutine. */ template void spawn(BOOST_ASIO_MOVE_ARG(Handler) handler, BOOST_ASIO_MOVE_ARG(Function) function, const boost::coroutines::attributes& attributes = boost::coroutines::attributes(), typename enable_if< !is_executor::type>::value && !execution::is_executor::type>::value && !is_convertible::value>::type* = 0); /// Start a new stackful coroutine, inheriting the execution context of another. /** * This function is used to launch a new coroutine. * * @param ctx Identifies the current coroutine as a parent of the new * coroutine. This specifies that the new coroutine should inherit the * execution context of the parent. For example, if the parent coroutine is * executing in a particular strand, then the new coroutine will execute in the * same strand. * * @param function The coroutine function. The function must have the signature: * @code void function(basic_yield_context yield); @endcode * * @param attributes Boost.Coroutine attributes used to customise the coroutine. */ template void spawn(basic_yield_context ctx, BOOST_ASIO_MOVE_ARG(Function) function, const boost::coroutines::attributes& attributes = boost::coroutines::attributes()); /// Start a new stackful coroutine that executes on a given executor. /** * This function is used to launch a new coroutine. * * @param ex Identifies the executor that will run the coroutine. The new * coroutine is implicitly given its own strand within this executor. * * @param function The coroutine function. The function must have the signature: * @code void function(yield_context yield); @endcode * * @param attributes Boost.Coroutine attributes used to customise the coroutine. */ template void spawn(const Executor& ex, BOOST_ASIO_MOVE_ARG(Function) function, const boost::coroutines::attributes& attributes = boost::coroutines::attributes(), typename enable_if< is_executor::value || execution::is_executor::value >::type* = 0); /// Start a new stackful coroutine that executes on a given strand. /** * This function is used to launch a new coroutine. * * @param ex Identifies the strand that will run the coroutine. * * @param function The coroutine function. The function must have the signature: * @code void function(yield_context yield); @endcode * * @param attributes Boost.Coroutine attributes used to customise the coroutine. */ template void spawn(const strand& ex, BOOST_ASIO_MOVE_ARG(Function) function, const boost::coroutines::attributes& attributes = boost::coroutines::attributes()); #if !defined(BOOST_ASIO_NO_TS_EXECUTORS) /// Start a new stackful coroutine that executes in the context of a strand. /** * This function is used to launch a new coroutine. * * @param s Identifies a strand. By starting multiple coroutines on the same * strand, the implementation ensures that none of those coroutines can execute * simultaneously. * * @param function The coroutine function. The function must have the signature: * @code void function(yield_context yield); @endcode * * @param attributes Boost.Coroutine attributes used to customise the coroutine. */ template void spawn(const boost::asio::io_context::strand& s, BOOST_ASIO_MOVE_ARG(Function) function, const boost::coroutines::attributes& attributes = boost::coroutines::attributes()); #endif // !defined(BOOST_ASIO_NO_TS_EXECUTORS) /// Start a new stackful coroutine that executes on a given execution context. /** * This function is used to launch a new coroutine. * * @param ctx Identifies the execution context that will run the coroutine. The * new coroutine is implicitly given its own strand within this execution * context. * * @param function The coroutine function. The function must have the signature: * @code void function(yield_context yield); @endcode * * @param attributes Boost.Coroutine attributes used to customise the coroutine. */ template void spawn(ExecutionContext& ctx, BOOST_ASIO_MOVE_ARG(Function) function, const boost::coroutines::attributes& attributes = boost::coroutines::attributes(), typename enable_if::value>::type* = 0); /*@}*/ } // namespace asio } // namespace boost #include #include #endif // BOOST_ASIO_SPAWN_HPP