blob: 67453674eae74bf5006d4e10b676e9c529fc09c2 [file] [log] [blame]
[/
/ Copyright (c) 2003-2016 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)
/]
[section:coroutine Stackless Coroutines]
The [link asio.reference.coroutine `coroutine`] class provides support for
stackless coroutines. Stackless coroutines enable programs to implement
asynchronous logic in a synchronous manner, with minimal overhead, as shown in
the following example:
struct session : asio::coroutine
{
boost::shared_ptr<tcp::socket> socket_;
boost::shared_ptr<std::vector<char> > buffer_;
session(boost::shared_ptr<tcp::socket> socket)
: socket_(socket),
buffer_(new std::vector<char>(1024))
{
}
void operator()(asio::error_code ec = asio::error_code(), std::size_t n = 0)
{
if (!ec) reenter (this)
{
for (;;)
{
yield socket_->async_read_some(asio::buffer(*buffer_), *this);
yield asio::async_write(*socket_, asio::buffer(*buffer_, n), *this);
}
}
}
};
The `coroutine` class is used in conjunction with the pseudo-keywords
`reenter`, `yield` and `fork`. These are preprocessor macros, and are
implemented in terms of a `switch` statement using a technique similar to
Duff's Device. The [link asio.reference.coroutine `coroutine`] class's
documentation provides a complete description of these pseudo-keywords.
[heading See Also]
[link asio.reference.coroutine coroutine],
[link asio.examples.cpp03_examples.http_server_4 HTTP Server 4 example],
[link asio.overview.core.spawn Stackful Coroutines].
[endsect]