Hi,
I have implemented a custom service using Boost 1.67 which works
mostly OK, but I have noticed it always returns success when using
spawn/yield.
The following simplified sample shows the problem:
------------------------------------------------
#include
#include
#include
#include <iostream>
class Service : public boost::asio::io_context::service {
public:
static boost::asio::io_context::id id;
typedef int implementation_type;
Service(boost::asio::io_context &io_context)
: boost::asio::io_context::service(io_context) {}
void construct(implementation_type &) {}
void destroy(implementation_type &) {}
};
boost::asio::io_context::id Service::id;
template <typename Service>
class BasicObject : protected boost::asio::basic_io_object<Service> {
public:
explicit BasicObject(boost::asio::io_context &io_context)
: boost::asio::basic_io_object<Service>(io_context) {}
template <typename ConnectHandler>
auto async_method(ConnectHandler &&handler) {
BOOST_ASIO_CONNECT_HANDLER_CHECK(ConnectHandler, handler) typeCheck;
boost::asio::async_completion
init(handler);
boost::system::error_code ec = boost::asio::error::already_started;
boost::asio::post(
boost::beast::bind_handler(std::move(init.completion_handler),
std::move(ec)));
return init.result.get();
}
};
int main() {
boost::asio::io_context ioContext;
BasicObject<Service> myObject(ioContext);
#if 1
boost::asio::spawn(ioContext, [&](boost::asio::yield_context yield) {
boost::system::error_code ec;
myObject.async_method(yield[ec]);
std::clog << ec << std::endl;
});
#else
myObject.async_method([](const boost::system::error_code &ec) {
std::clog << ec << std::endl;
});
#endif
ioContext.run();
return 0;
}
------------------------------------------------
The version not using spawn prints "system:114", the one using spawn
prints "system:0". What am I doing wrong?
Thanks.