diff --git a/test/server/session.cpp b/test/server/session.cpp index ec67e21..1255d6b 100644 --- a/test/server/session.cpp +++ b/test/server/session.cpp @@ -7,28 +7,24 @@ session::session(boost::asio::io_service &io_service): boost::asio::coroutine(), { } -session::~session() -{ - std::cout << "session destructor" << std::endl; -} - void session::start(boost::system::error_code ec, std::size_t bytes_transferred) { if(!ec) { - reenter(this) for(;;) + reenter(this) for(;;) // псевдолинейный код { std::memset(_data, 0, 128); yield _socket.async_read_some(boost::asio::buffer(_data, 128), std::bind(&session::start, this, std::placeholders::_1, std::placeholders::_2)); - std::cout << "async_read " << bytes_transferred << " bytes" << std::endl; - std::cout << "number: " << std::atoi(_data) << std::endl; -// yield _pool.add_task([this]{ -// return 42; -// }); + yield _fut = call_async([this]{ + int n = std::atoi(_data); + return n*n; + }); - yield _socket.async_write_some(boost::asio::buffer(_data, 128), std::bind(&session::start, this, std::placeholders::_1, std::placeholders::_2)); - std::cout << "async_write" << std::endl; + yield { + std::string res = std::to_string(_fut.get()) + "\n"; + _socket.async_write_some(boost::asio::buffer(res), std::bind(&session::start, this, std::placeholders::_1, std::placeholders::_2)); + } } } else diff --git a/test/server/session.h b/test/server/session.h index d1267a4..3cead8d 100644 --- a/test/server/session.h +++ b/test/server/session.h @@ -15,12 +15,23 @@ private: char _data[128]; threadpool _pool; + // "local" variables + std::future _fut; + public: session() = delete; session(session&) = delete; session(boost::asio::io_service& io_service); void start(boost::system::error_code ec = boost::system::error_code(), std::size_t bytes_transferred = 0); - ~session(); + + template std::future call_async(std::function func) + { + return _pool.add_task([this, &func]{ + R result = func(); + _socket.get_io_service().dispatch(std::bind(&session::start, this, boost::system::error_code(), 0)); + return result; + }); + } };