diff --git a/include/boost/beast/core/basic_stream.hpp b/include/boost/beast/core/basic_stream.hpp index 25076059..eb340838 100644 --- a/include/boost/beast/core/basic_stream.hpp +++ b/include/boost/beast/core/basic_stream.hpp @@ -237,7 +237,15 @@ private: op_state read; op_state write; - net::steady_timer timer; // rate timer +#if 0 + net::basic_waitable_timer< + std::chrono::steady_clock, + net::wait_traits< + std::chrono::steady_clock>, + Executor> timer; // rate timer; +#else + net::steady_timer timer; +#endif int waiting = 0; impl_type(impl_type&&) = default; diff --git a/test/beast/core/basic_stream.cpp b/test/beast/core/basic_stream.cpp index f4f6a58c..4b64c79b 100644 --- a/test/beast/core/basic_stream.cpp +++ b/test/beast/core/basic_stream.cpp @@ -1259,6 +1259,44 @@ public: //-------------------------------------------------------------------------- + void + testIssue1589() + { + net::io_context ioc; + + // the timer needlessly used polymorphic executor + basic_stream< + net::ip::tcp, + net::io_context::executor_type>{ioc}; + + // make sure strands work + basic_stream< + net::ip::tcp, + net::strand< + net::io_context::executor_type>>{ + net::make_strand(ioc)}; + + // address the problem in the issue + { + net::basic_stream_socket< + net::ip::tcp, + net::strand< + net::io_context::executor_type> + > sock(net::make_strand(ioc)); + basic_stream< + net::ip::tcp, + net::strand< + net::io_context::executor_type>, + unlimited_rate_policy> stream(std::move(sock)); + BOOST_STATIC_ASSERT( + std::is_convertible< + decltype(sock)::executor_type, + decltype(stream)::executor_type>::value); + } + } + + //-------------------------------------------------------------------------- + void run() { @@ -1268,6 +1306,7 @@ public: testConnect(); testMembers(); testJavadocs(); + testIssue1589(); } };