2
0
mirror of https://github.com/boostorg/cobalt.git synced 2026-01-19 16:12:15 +00:00
Files
cobalt/doc/reference/with.adoc
Klemens Morgenstern b807c700dc doc typo fixes
2026-01-11 07:27:47 +08:00

48 lines
1.4 KiB
Plaintext

[#with]
== cobalt/with.hpp
The `with` facility provides a way to perform asynchronous tear-down of coroutines.
That is it like an asynchronous destructor call.
[source,cpp]
----
struct my_resource
{
cobalt::promise<void> await_exit(std::exception_ptr e);
};
cobalt::promise<void> work(my_resource & res);
cobalt::promise<void> outer()
{
co_await cobalt::with(my_resource(), &work);
}
----
The teardown can either be done by providing an `await_exit` member function or a `tag_invoke` function
that returns an <<awaitable, awaitable>> or by providing the teardown as the third argument to `with`.
[source,cpp]
----
using ws_stream = beast::websocket::stream<asio::ip::tcp::socket>;
cobalt::promise<ws_stream> connect(urls::url); // <1>
cobalt::promise<void> disconnect(ws_stream &ws); // <2>
auto teardown(const boost::cobalt::with_exit_tag & wet , ws_stream & ws, std::exception_ptr e)
{
return disconnect(ws);
}
cobalt::promise<void> run_session(ws_stream & ws);
cobalt::main co_main(int argc, char * argv[])
{
co_await cobalt::with(co_await connect(argv[1]), &run_session, &teardown);
co_return 0;
}
----
<1> Implement websocket connect & websocket initiation
<2> Implement an orderly shutdown.
NOTE: The `std::exception_ptr` is null if the scope is exited without exception.
NOTE: It's legal for the `exit` functions to take the `exception_ptr` by reference and modify it.