Fix co_spawn.
diff --git a/asio/include/asio/experimental/co_spawn.hpp b/asio/include/asio/experimental/co_spawn.hpp
index 39924b5..b6b862b 100644
--- a/asio/include/asio/experimental/co_spawn.hpp
+++ b/asio/include/asio/experimental/co_spawn.hpp
@@ -20,6 +20,7 @@
#include "asio/compose.hpp"
#include "asio/detail/type_traits.hpp"
#include "asio/experimental/coro.hpp"
+#include "asio/experimental/prepend.hpp"
#include "asio/redirect_error.hpp"
#include "asio/detail/push_options.hpp"
@@ -29,20 +30,18 @@
namespace detail {
template <typename T, typename U, typename Executor>
-struct coro_spawn_initiate
+struct coro_spawn_op
{
- coro<T, U, Executor> c;
+ std::shared_ptr<coro<T, U, Executor>> c;
void operator()(auto& self)
{
- auto cp = std::make_shared<coro<T, U, Executor>>(std::move(c));
- cp->async_resume(
- bind_executor(
- self.get_executor(),
- [cp, self = std::move(self)](auto... res) mutable
- {
- self.complete(std::move(res)...);
- }));
+ c->async_resume((prepend)(std::move(self), 0));
+ }
+
+ void operator()(auto& self, int, auto... res)
+ {
+ self.complete(std::move(res)...);
}
};
@@ -66,7 +65,8 @@
{
auto exec = c.get_executor();
return async_compose<CompletionToken, void(std::exception_ptr, T)>(
- detail::coro_spawn_initiate<void, T, Executor>{std::move(c)},
+ detail::coro_spawn_op<void, T, Executor>{
+ std::make_shared<coro<void, T, Executor>>(std::move(c))},
token, exec);
}
@@ -88,7 +88,8 @@
{
auto exec = c.get_executor();
return async_compose<CompletionToken, void(std::exception_ptr, T)>(
- detail::coro_spawn_initiate<void(), T, Executor>{std::move(c)},
+ detail::coro_spawn_op<void(), T, Executor>{
+ std::make_shared<coro<void(), T, Executor>>(std::move(c))},
token, exec);
}
@@ -109,7 +110,8 @@
{
auto exec = c.get_executor();
return async_compose<CompletionToken, void(T)>(
- detail::coro_spawn_initiate<void() noexcept, T, Executor>{std::move(c)},
+ detail::coro_spawn_op<void() noexcept, T, Executor>{
+ std::make_shared<coro<void() noexcept, T, Executor>>(std::move(c))},
token, exec);
}
@@ -131,7 +133,8 @@
{
auto exec = c.get_executor();
return async_compose<CompletionToken, void(std::exception_ptr)>(
- detail::coro_spawn_initiate<void, void, Executor>{std::move(c)},
+ detail::coro_spawn_op<void, void, Executor>{
+ std::make_shared<coro<void, void, Executor>>(std::move(c))},
token, exec);
}
@@ -153,7 +156,8 @@
{
auto exec = c.get_executor();
return async_compose<CompletionToken, void(std::exception_ptr)>(
- detail::coro_spawn_initiate<void(), void, Executor>{std::move(c)},
+ detail::coro_spawn_op<void(), void, Executor>{
+ std::make_shared<coro<void(), void, Executor>>(std::move(c))},
token, exec);
}
@@ -174,8 +178,8 @@
{
auto exec = c.get_executor();
return async_compose<CompletionToken, void()>(
- detail::coro_spawn_initiate<void() noexcept, void, Executor>{
- std::move(c)},
+ detail::coro_spawn_op<void() noexcept, void, Executor>{
+ std::make_shared<coro<void() noexcept, void, Executor>>(std::move(c))},
token, exec);
}