diff options
Diffstat (limited to '3rdparty/asio/src/examples/cpp14/executors/async_2.cpp')
-rw-r--r-- | 3rdparty/asio/src/examples/cpp14/executors/async_2.cpp | 59 |
1 files changed, 35 insertions, 24 deletions
diff --git a/3rdparty/asio/src/examples/cpp14/executors/async_2.cpp b/3rdparty/asio/src/examples/cpp14/executors/async_2.cpp index b39156dcb23..ee4a72e80c3 100644 --- a/3rdparty/asio/src/examples/cpp14/executors/async_2.cpp +++ b/3rdparty/asio/src/examples/cpp14/executors/async_2.cpp @@ -1,30 +1,33 @@ -#include <asio/ts/executor.hpp> -#include <asio/thread_pool.hpp> +#include <asio/associated_executor.hpp> +#include <asio/bind_executor.hpp> +#include <asio/execution.hpp> +#include <asio/static_thread_pool.hpp> #include <iostream> #include <string> using asio::bind_executor; -using asio::dispatch; using asio::get_associated_executor; -using asio::make_work_guard; -using asio::post; -using asio::thread_pool; +using asio::static_thread_pool; +namespace execution = asio::execution; // A function to asynchronously read a single line from an input stream. -template <class Handler> -void async_getline(std::istream& is, Handler handler) +template <class IoExecutor, class Handler> +void async_getline(IoExecutor io_ex, std::istream& is, Handler handler) { - // Create executor_work for the handler's associated executor. - auto work = make_work_guard(handler); + // Track work for the handler's associated executor. + auto work_ex = asio::prefer( + get_associated_executor(handler, io_ex), + execution::outstanding_work.tracked); // Post a function object to do the work asynchronously. - post([&is, work, handler=std::move(handler)]() mutable + asio::require(io_ex, execution::blocking.never).execute( + [&is, work_ex, handler=std::move(handler)]() mutable { std::string line; std::getline(is, line); // Pass the result to the handler, via the associated executor. - dispatch(work.get_executor(), + asio::prefer(work_ex, execution::blocking.possibly).execute( [line=std::move(line), handler=std::move(handler)]() mutable { handler(std::move(line)); @@ -33,36 +36,44 @@ void async_getline(std::istream& is, Handler handler) } // A function to asynchronously read multiple lines from an input stream. -template <class Handler> -void async_getlines(std::istream& is, std::string init, Handler handler) +template <class IoExecutor, class Handler> +void async_getlines(IoExecutor io_ex, std::istream& is, std::string init, Handler handler) { - // Get the final handler's associated executor. - auto ex = get_associated_executor(handler); + // Track work for the I/O executor. + auto io_work_ex = asio::prefer(io_ex, + execution::outstanding_work.tracked); + + // Track work for the handler's associated executor. + auto handler_work_ex = asio::prefer( + get_associated_executor(handler, io_ex), + execution::outstanding_work.tracked); // Use the associated executor for each operation in the composition. - async_getline(is, - bind_executor(ex, - [&is, lines=std::move(init), handler=std::move(handler)] + async_getline(io_work_ex, is, + bind_executor(handler_work_ex, + [io_work_ex, &is, lines=std::move(init), handler=std::move(handler)] (std::string line) mutable { if (line.empty()) handler(lines); else - async_getlines(is, lines + line + "\n", std::move(handler)); + async_getlines(io_work_ex, is, lines + line + "\n", std::move(handler)); })); } int main() { - thread_pool pool; + static_thread_pool io_pool(1); + static_thread_pool completion_pool(1); std::cout << "Enter text, terminating with a blank line:\n"; - async_getlines(std::cin, "", - bind_executor(pool, [](std::string lines) + async_getlines(io_pool.executor(), std::cin, "", + bind_executor(completion_pool.executor(), [](std::string lines) { std::cout << "Lines:\n" << lines << "\n"; })); - pool.join(); + io_pool.wait(); + completion_pool.wait(); } |