diff --git a/include/boost/beast/_experimental/http/impl/icy_stream.hpp b/include/boost/beast/_experimental/http/impl/icy_stream.hpp index e207f935..0e8657fd 100644 --- a/include/boost/beast/_experimental/http/impl/icy_stream.hpp +++ b/include/boost/beast/_experimental/http/impl/icy_stream.hpp @@ -167,11 +167,20 @@ public: struct run_read_op { + icy_stream* self; + + using executor_type = typename icy_stream::executor_type; + + executor_type + get_executor() const noexcept + { + return self->get_executor(); + } + template void operator()( ReadHandler&& h, - icy_stream* s, Buffers const& b) { // If you get an error on the following line it means @@ -186,7 +195,7 @@ struct run_read_op read_op< Buffers, typename std::decay::type>( - std::forward(h), *s, b); + std::forward(h), *self, b); } }; @@ -292,9 +301,8 @@ async_read_some( return net::async_initiate< ReadHandler, void(error_code, std::size_t)>( - typename ops::run_read_op{}, + typename ops::run_read_op{this}, handler, - this, buffers); } diff --git a/include/boost/beast/_experimental/test/impl/stream.hpp b/include/boost/beast/_experimental/test/impl/stream.hpp index 3e3cd613..2dacc924 100644 --- a/include/boost/beast/_experimental/test/impl/stream.hpp +++ b/include/boost/beast/_experimental/test/impl/stream.hpp @@ -27,7 +27,27 @@ namespace boost { namespace beast { namespace test { -//------------------------------------------------------------------------------ +namespace detail +{ +template +struct extract_executor_op +{ + To operator()(net::any_io_executor& ex) const + { + assert(ex.template target()); + return *ex.template target(); + } +}; + +template<> +struct extract_executor_op +{ + net::any_io_executor operator()(net::any_io_executor& ex) const + { + return ex; + } +}; +} // detail template template @@ -163,13 +183,22 @@ public: template struct basic_stream::run_read_op { + boost::shared_ptr const& in; + + using executor_type = typename basic_stream::executor_type; + + executor_type + get_executor() const noexcept + { + return detail::extract_executor_op()(in->exec); + } + template< class ReadHandler, class MutableBufferSequence> void operator()( ReadHandler&& h, - boost::shared_ptr const& in, MutableBufferSequence const& buffers) { // If you get an error on the following line it means @@ -197,13 +226,22 @@ struct basic_stream::run_read_op template struct basic_stream::run_write_op { + boost::shared_ptr const& in_; + + using executor_type = typename basic_stream::executor_type; + + executor_type + get_executor() const noexcept + { + return detail::extract_executor_op()(in_->exec); + } + template< class WriteHandler, class ConstBufferSequence> void operator()( WriteHandler&& h, - boost::shared_ptr in_, boost::weak_ptr out_, ConstBufferSequence const& buffers) { @@ -336,9 +374,8 @@ async_read_some( return net::async_initiate< ReadHandler, void(error_code, std::size_t)>( - run_read_op{}, + run_read_op{in_}, handler, - in_, buffers); } @@ -420,9 +457,8 @@ async_write_some( return net::async_initiate< WriteHandler, void(error_code, std::size_t)>( - run_write_op{}, + run_write_op{in_}, handler, - in_, out_, buffers); } @@ -467,28 +503,6 @@ connect(stream& to, Arg1&& arg1, ArgN&&... argn) return from; } -namespace detail -{ -template -struct extract_executor_op -{ - To operator()(net::any_io_executor& ex) const - { - assert(ex.template target()); - return *ex.template target(); - } -}; - -template<> -struct extract_executor_op -{ - net::any_io_executor operator()(net::any_io_executor& ex) const - { - return ex; - } -}; -} - template auto basic_stream::get_executor() noexcept -> executor_type { diff --git a/include/boost/beast/core/detail/impl/read.hpp b/include/boost/beast/core/detail/impl/read.hpp index d7d5ce74..bbc4491c 100644 --- a/include/boost/beast/core/detail/impl/read.hpp +++ b/include/boost/beast/core/detail/impl/read.hpp @@ -104,17 +104,26 @@ public: //------------------------------------------------------------------------------ +template struct run_read_op { + AsyncReadStream* stream; + + using executor_type = typename AsyncReadStream::executor_type; + + executor_type + get_executor() const noexcept + { + return stream->get_executor(); + } + template< - class AsyncReadStream, class DynamicBuffer, class Condition, class ReadHandler> void operator()( ReadHandler&& h, - AsyncReadStream* s, DynamicBuffer* b, Condition&& c) { @@ -133,7 +142,7 @@ struct run_read_op typename std::decay::type, typename std::decay::type>( std::forward(h), - *s, + *stream, *b, std::forward(c)); } @@ -234,9 +243,8 @@ async_read( return net::async_initiate< ReadHandler, void(error_code, std::size_t)>( - typename dynamic_read_ops::run_read_op{}, + typename dynamic_read_ops::run_read_op{&stream}, handler, - &stream, &buffer, std::forward(cond)); } diff --git a/include/boost/beast/core/detect_ssl.hpp b/include/boost/beast/core/detect_ssl.hpp index f497f7b4..6ad0ffd5 100644 --- a/include/boost/beast/core/detect_ssl.hpp +++ b/include/boost/beast/core/detect_ssl.hpp @@ -348,6 +348,7 @@ class detect_ssl_op; // authors of composed operations need to write it this way to get the // very best performance, for example when using Coroutines TS (`co_await`). +template struct run_detect_ssl_op { // The implementation of `net::async_initiate` captures the @@ -361,20 +362,29 @@ struct run_detect_ssl_op // token into the "real handler" which must have the correct // signature, in this case `void(error_code, boost::tri_bool)`. + AsyncReadStream* stream; + + using executor_type = typename AsyncReadStream::executor_type; + + executor_type + get_executor() const noexcept + { + return stream->get_executor(); + } + template< class DetectHandler, - class AsyncReadStream, class DynamicBuffer> - void operator()( + void + operator()( DetectHandler&& h, - AsyncReadStream* s, // references are passed as pointers DynamicBuffer* b) { detect_ssl_op< typename std::decay::type, AsyncReadStream, DynamicBuffer>( - std::forward(h), *s, *b); + std::forward(h), *stream, *b); } }; @@ -423,9 +433,8 @@ async_detect_ssl( return net::async_initiate< CompletionToken, void(error_code, bool)>( - detail::run_detect_ssl_op{}, + detail::run_detect_ssl_op{&stream}, token, - &stream, // pass the reference by pointer &buffer); } diff --git a/include/boost/beast/core/impl/basic_stream.hpp b/include/boost/beast/core/impl/basic_stream.hpp index 82869399..d1663407 100644 --- a/include/boost/beast/core/impl/basic_stream.hpp +++ b/include/boost/beast/core/impl/basic_stream.hpp @@ -606,11 +606,20 @@ public: struct run_read_op { + basic_stream* self; + + using executor_type = typename basic_stream::executor_type; + + executor_type + get_executor() const noexcept + { + return self->get_executor(); + } + template void operator()( ReadHandler&& h, - basic_stream* s, Buffers const& b) { // If you get an error on the following line it means @@ -626,17 +635,26 @@ struct run_read_op true, Buffers, typename std::decay::type>( - std::forward(h), *s, b); + std::forward(h), *self, b); } }; struct run_write_op { + basic_stream* self; + + using executor_type = typename basic_stream::executor_type; + + executor_type + get_executor() const noexcept + { + return self->get_executor(); + } + template void operator()( WriteHandler&& h, - basic_stream* s, Buffers const& b) { // If you get an error on the following line it means @@ -652,17 +670,26 @@ struct run_write_op false, Buffers, typename std::decay::type>( - std::forward(h), *s, b); + std::forward(h), *self, b); } }; struct run_connect_op { + basic_stream* self; + + using executor_type = typename basic_stream::executor_type; + + executor_type + get_executor() const noexcept + { + return self->get_executor(); + } + template void operator()( ConnectHandler&& h, - basic_stream* s, endpoint_type const& ep) { // If you get an error on the following line it means @@ -675,12 +702,22 @@ struct run_connect_op "ConnectHandler type requirements not met"); connect_op::type>( - std::forward(h), *s, ep); + std::forward(h), *self, ep); } }; struct run_connect_range_op { + basic_stream* self; + + using executor_type = typename basic_stream::executor_type; + + executor_type + get_executor() const noexcept + { + return self->get_executor(); + } + template< class RangeConnectHandler, class EndpointSequence, @@ -688,7 +725,6 @@ struct run_connect_range_op void operator()( RangeConnectHandler&& h, - basic_stream* s, EndpointSequence const& eps, Condition const& cond) { @@ -702,12 +738,22 @@ struct run_connect_range_op "RangeConnectHandler type requirements not met"); connect_op::type>( - std::forward(h), *s, eps, cond); + std::forward(h), *self, eps, cond); } }; struct run_connect_iter_op { + basic_stream* self; + + using executor_type = typename basic_stream::executor_type; + + executor_type + get_executor() const noexcept + { + return self->get_executor(); + } + template< class IteratorConnectHandler, class Iterator, @@ -715,7 +761,6 @@ struct run_connect_iter_op void operator()( IteratorConnectHandler&& h, - basic_stream* s, Iterator begin, Iterator end, Condition const& cond) { @@ -729,7 +774,7 @@ struct run_connect_iter_op "IteratorConnectHandler type requirements not met"); connect_op::type>( - std::forward(h), *s, begin, end, cond); + std::forward(h), *self, begin, end, cond); } }; @@ -895,9 +940,8 @@ async_connect( return net::async_initiate< ConnectHandler, void(error_code)>( - typename ops::run_connect_op{}, + typename ops::run_connect_op{this}, handler, - this, ep); } @@ -916,9 +960,8 @@ async_connect( return net::async_initiate< RangeConnectHandler, void(error_code, typename Protocol::endpoint)>( - typename ops::run_connect_range_op{}, + typename ops::run_connect_range_op{this}, handler, - this, endpoints, detail::any_endpoint{}); } @@ -940,9 +983,8 @@ async_connect( return net::async_initiate< RangeConnectHandler, void(error_code, typename Protocol::endpoint)>( - typename ops::run_connect_range_op{}, + typename ops::run_connect_range_op{this}, handler, - this, endpoints, connect_condition); } @@ -961,9 +1003,8 @@ async_connect( return net::async_initiate< IteratorConnectHandler, void(error_code, Iterator)>( - typename ops::run_connect_iter_op{}, + typename ops::run_connect_iter_op{this}, handler, - this, begin, end, detail::any_endpoint{}); } @@ -984,9 +1025,8 @@ async_connect( return net::async_initiate< IteratorConnectHandler, void(error_code, Iterator)>( - typename ops::run_connect_iter_op{}, + typename ops::run_connect_iter_op{this}, handler, - this, begin, end, connect_condition); } @@ -1007,9 +1047,8 @@ async_read_some( return net::async_initiate< ReadHandler, void(error_code, std::size_t)>( - typename ops::run_read_op{}, + typename ops::run_read_op{this}, handler, - this, buffers); } @@ -1027,9 +1066,8 @@ async_write_some( return net::async_initiate< WriteHandler, void(error_code, std::size_t)>( - typename ops::run_write_op{}, + typename ops::run_write_op{this}, handler, - this, buffers); } diff --git a/include/boost/beast/core/impl/buffered_read_stream.hpp b/include/boost/beast/core/impl/buffered_read_stream.hpp index fa0e4e4b..0423e1ad 100644 --- a/include/boost/beast/core/impl/buffered_read_stream.hpp +++ b/include/boost/beast/core/impl/buffered_read_stream.hpp @@ -106,11 +106,20 @@ public: struct run_read_op { + buffered_read_stream* self; + + using executor_type = typename buffered_read_stream::executor_type; + + executor_type + get_executor() const noexcept + { + return self->get_executor(); + } + template void operator()( ReadHandler&& h, - buffered_read_stream* s, Buffers const* b) { // If you get an error on the following line it means @@ -125,7 +134,7 @@ struct run_read_op read_op< Buffers, typename std::decay::type>( - std::forward(h), *s, *b); + std::forward(h), *self, *b); } }; @@ -231,9 +240,8 @@ async_read_some( return net::async_initiate< ReadHandler, void(error_code, std::size_t)>( - typename ops::run_read_op{}, + typename ops::run_read_op{this}, handler, - this, &buffers); } diff --git a/include/boost/beast/core/impl/flat_stream.hpp b/include/boost/beast/core/impl/flat_stream.hpp index 11c75c4c..2250b425 100644 --- a/include/boost/beast/core/impl/flat_stream.hpp +++ b/include/boost/beast/core/impl/flat_stream.hpp @@ -85,11 +85,20 @@ public: struct run_write_op { + flat_stream* self; + + using executor_type = typename flat_stream::executor_type; + + executor_type + get_executor() const noexcept + { + return self->get_executor(); + } + template void operator()( WriteHandler&& h, - flat_stream* s, Buffers const& b) { // If you get an error on the following line it means @@ -103,7 +112,7 @@ struct run_write_op write_op< typename std::decay::type>( - std::forward(h), *s, b); + std::forward(h), *self, b); } }; @@ -250,9 +259,8 @@ async_write_some( return net::async_initiate< WriteHandler, void(error_code, std::size_t)>( - typename ops::run_write_op{}, + typename ops::run_write_op{this}, handler, - this, buffers); } diff --git a/include/boost/beast/http/impl/file_body_win32.hpp b/include/boost/beast/http/impl/file_body_win32.hpp index f9038de5..cd863793 100644 --- a/include/boost/beast/http/impl/file_body_win32.hpp +++ b/include/boost/beast/http/impl/file_body_win32.hpp @@ -509,17 +509,23 @@ public: } }; +template struct run_write_some_win32_op { - template< - class Protocol, class Executor, - bool isRequest, class Fields, - class WriteHandler> + net::basic_stream_socket* stream; + + using executor_type = typename net::basic_stream_socket::executor_type; + + executor_type + get_executor() const noexcept + { + return stream->get_executor(); + } + + template void operator()( WriteHandler&& h, - net::basic_stream_socket< - Protocol, Executor>* s, serializer, Fields>* sr) { @@ -536,7 +542,7 @@ struct run_write_some_win32_op Protocol, Executor, isRequest, Fields, typename std::decay::type>( - std::forward(h), *s, *sr); + std::forward(h), *stream, *sr); } }; @@ -629,9 +635,8 @@ async_write_some( return net::async_initiate< WriteHandler, void(error_code, std::size_t)>( - detail::run_write_some_win32_op{}, + detail::run_write_some_win32_op{&sock}, handler, - &sock, &sr); } diff --git a/include/boost/beast/http/impl/read.hpp b/include/boost/beast/http/impl/read.hpp index 683b4a13..a96ccea2 100644 --- a/include/boost/beast/http/impl/read.hpp +++ b/include/boost/beast/http/impl/read.hpp @@ -116,17 +116,26 @@ public: } }; +template struct run_read_msg_op { + AsyncReadStream* stream; + + using executor_type = typename AsyncReadStream::executor_type; + + executor_type + get_executor() const noexcept + { + return stream->get_executor(); + } + template< class ReadHandler, - class AsyncReadStream, class DynamicBuffer, bool isRequest, class Body, class Allocator> void operator()( ReadHandler&& h, - AsyncReadStream* s, DynamicBuffer* b, message>* m) @@ -145,7 +154,7 @@ struct run_read_msg_op DynamicBuffer, isRequest, Body, Allocator, typename std::decay::type>( - std::forward(h), *s, *b, *m); + std::forward(h), *stream, *b, *m); } }; @@ -710,8 +719,8 @@ async_read( return net::async_initiate< ReadHandler, void(error_code, std::size_t)>( - detail::run_read_msg_op{}, - handler, &stream, &buffer, &msg); + detail::run_read_msg_op{&stream}, + handler, &buffer, &msg); } } // http diff --git a/include/boost/beast/http/impl/write.hpp b/include/boost/beast/http/impl/write.hpp index 312177a9..119ab80b 100644 --- a/include/boost/beast/http/impl/write.hpp +++ b/include/boost/beast/http/impl/write.hpp @@ -299,16 +299,25 @@ public: } }; +template struct run_write_some_op { + AsyncWriteStream* stream; + + using executor_type = typename AsyncWriteStream::executor_type; + + executor_type + get_executor() const noexcept + { + return stream->get_executor(); + } + template< class WriteHandler, - class Stream, bool isRequest, class Body, class Fields> void operator()( WriteHandler&& h, - Stream* s, serializer* sr) { // If you get an error on the following line it means @@ -322,23 +331,32 @@ struct run_write_some_op write_some_op< typename std::decay::type, - Stream, + AsyncWriteStream, isRequest, Body, Fields>( - std::forward(h), *s, *sr); + std::forward(h), *stream, *sr); } }; +template struct run_write_op { + AsyncWriteStream* stream; + + using executor_type = typename AsyncWriteStream::executor_type; + + executor_type + get_executor() const noexcept + { + return stream->get_executor(); + } + template< class WriteHandler, - class Stream, class Predicate, bool isRequest, class Body, class Fields> void operator()( WriteHandler&& h, - Stream* s, Predicate const&, serializer* sr) { @@ -353,24 +371,33 @@ struct run_write_op write_op< typename std::decay::type, - Stream, + AsyncWriteStream, Predicate, isRequest, Body, Fields>( - std::forward(h), *s, *sr); + std::forward(h), *stream, *sr); } }; +template struct run_write_msg_op { + AsyncWriteStream* stream; + + using executor_type = typename AsyncWriteStream::executor_type; + + executor_type + get_executor() const noexcept + { + return stream->get_executor(); + } + template< class WriteHandler, - class Stream, bool isRequest, class Body, class Fields, class... Args> void operator()( WriteHandler&& h, - Stream* s, message* m, std::false_type, Args&&... args) @@ -386,21 +413,19 @@ struct run_write_msg_op write_msg_op< typename std::decay::type, - Stream, + AsyncWriteStream, isRequest, Body, Fields>( - std::forward(h), *s, *m, + std::forward(h), *stream, *m, std::forward(args)...); } template< class WriteHandler, - class Stream, bool isRequest, class Body, class Fields, class... Args> void operator()( WriteHandler&& h, - Stream* s, message const* m, std::true_type, Args&&... args) @@ -416,9 +441,9 @@ struct run_write_msg_op write_msg_op< typename std::decay::type, - Stream, + AsyncWriteStream, isRequest, Body, Fields>( - std::forward(h), *s, *m, + std::forward(h), *stream, *m, std::forward(args)...); } }; @@ -513,9 +538,8 @@ async_write_some_impl( return net::async_initiate< WriteHandler, void(error_code, std::size_t)>( - run_write_some_op{}, + run_write_some_op{&stream}, handler, - &stream, &sr); } @@ -666,9 +690,8 @@ async_write_header( return net::async_initiate< WriteHandler, void(error_code, std::size_t)>( - detail::run_write_op{}, + detail::run_write_op{&stream}, handler, - &stream, detail::serializer_is_header_done{}, &sr); } @@ -739,9 +762,8 @@ async_write( return net::async_initiate< WriteHandler, void(error_code, std::size_t)>( - detail::run_write_op{}, + detail::run_write_op{&stream}, handler, - &stream, detail::serializer_is_done{}, &sr); } @@ -860,9 +882,8 @@ async_write( return net::async_initiate< WriteHandler, void(error_code, std::size_t)>( - detail::run_write_msg_op{}, + detail::run_write_msg_op{&stream}, handler, - &stream, &msg, std::false_type{}); } @@ -889,9 +910,8 @@ async_write( return net::async_initiate< WriteHandler, void(error_code, std::size_t)>( - detail::run_write_msg_op{}, + detail::run_write_msg_op{&stream}, handler, - &stream, &msg, std::true_type{}); } diff --git a/include/boost/beast/websocket/impl/accept.hpp b/include/boost/beast/websocket/impl/accept.hpp index 87e264a1..7591713c 100644 --- a/include/boost/beast/websocket/impl/accept.hpp +++ b/include/boost/beast/websocket/impl/accept.hpp @@ -368,6 +368,16 @@ template struct stream:: run_response_op { + boost::shared_ptr const& self; + + using executor_type = typename stream::executor_type; + + executor_type + get_executor() const noexcept + { + return self->stream().get_executor(); + } + template< class AcceptHandler, class Body, class Allocator, @@ -375,7 +385,6 @@ struct stream:: void operator()( AcceptHandler&& h, - boost::shared_ptr const& sp, http::request> const* m, Decorator const& d) @@ -391,7 +400,7 @@ struct stream:: response_op< typename std::decay::type>( - std::forward(h), sp, *m, d); + std::forward(h), self, *m, d); } }; @@ -399,6 +408,16 @@ template struct stream:: run_accept_op { + boost::shared_ptr const& self; + + using executor_type = typename stream::executor_type; + + executor_type + get_executor() const noexcept + { + return self->stream().get_executor(); + } + template< class AcceptHandler, class Decorator, @@ -406,7 +425,6 @@ struct stream:: void operator()( AcceptHandler&& h, - boost::shared_ptr const& sp, Decorator const& d, Buffers const& b) { @@ -423,7 +441,7 @@ struct stream:: typename std::decay::type, Decorator>( std::forward(h), - sp, + self, d, b); } @@ -615,9 +633,8 @@ async_accept( return net::async_initiate< AcceptHandler, void(error_code)>( - run_accept_op{}, + run_accept_op{impl_}, handler, - impl_, &default_decorate_res, net::const_buffer{}); } @@ -648,9 +665,8 @@ async_accept( return net::async_initiate< AcceptHandler, void(error_code)>( - run_accept_op{}, + run_accept_op{impl_}, handler, - impl_, &default_decorate_res, buffers); } @@ -671,9 +687,8 @@ async_accept( return net::async_initiate< AcceptHandler, void(error_code)>( - run_response_op{}, + run_response_op{impl_}, handler, - impl_, &req, &default_decorate_res); } diff --git a/include/boost/beast/websocket/impl/close.hpp b/include/boost/beast/websocket/impl/close.hpp index 85882186..0e6549d6 100644 --- a/include/boost/beast/websocket/impl/close.hpp +++ b/include/boost/beast/websocket/impl/close.hpp @@ -302,11 +302,20 @@ template struct stream:: run_close_op { + boost::shared_ptr const& self; + + using executor_type = typename stream::executor_type; + + executor_type + get_executor() const noexcept + { + return self->stream().get_executor(); + } + template void operator()( CloseHandler&& h, - boost::shared_ptr const& sp, close_reason const& cr) { // If you get an error on the following line it means @@ -321,7 +330,7 @@ struct stream:: close_op< typename std::decay::type>( std::forward(h), - sp, + self, cr); } }; @@ -458,9 +467,8 @@ async_close(close_reason const& cr, CloseHandler&& handler) return net::async_initiate< CloseHandler, void(error_code)>( - run_close_op{}, + run_close_op{impl_}, handler, - impl_, cr); } diff --git a/include/boost/beast/websocket/impl/handshake.hpp b/include/boost/beast/websocket/impl/handshake.hpp index c7f7bee9..eb471ed0 100644 --- a/include/boost/beast/websocket/impl/handshake.hpp +++ b/include/boost/beast/websocket/impl/handshake.hpp @@ -188,10 +188,19 @@ template struct stream:: run_handshake_op { + boost::shared_ptr const& self; + + using executor_type = typename stream::executor_type; + + executor_type + get_executor() const noexcept + { + return self->stream().get_executor(); + } + template void operator()( HandshakeHandler&& h, - boost::shared_ptr const& sp, request_type&& req, detail::sec_ws_key_type key, response_type* res_p) @@ -208,7 +217,7 @@ struct stream:: handshake_op< typename std::decay::type>( std::forward(h), - sp, std::move(req), key, res_p); + self, std::move(req), key, res_p); } }; @@ -311,9 +320,8 @@ async_handshake( return net::async_initiate< HandshakeHandler, void(error_code)>( - run_handshake_op{}, + run_handshake_op{impl_}, handler, - impl_, std::move(req), key, nullptr); @@ -338,9 +346,8 @@ async_handshake( return net::async_initiate< HandshakeHandler, void(error_code)>( - run_handshake_op{}, + run_handshake_op{impl_}, handler, - impl_, std::move(req), key, &res); diff --git a/include/boost/beast/websocket/impl/ping.hpp b/include/boost/beast/websocket/impl/ping.hpp index 68241b6b..89ebea7d 100644 --- a/include/boost/beast/websocket/impl/ping.hpp +++ b/include/boost/beast/websocket/impl/ping.hpp @@ -245,11 +245,20 @@ template struct stream:: run_ping_op { + boost::shared_ptr const& self; + + using executor_type = typename stream::executor_type; + + executor_type + get_executor() const noexcept + { + return self->stream().get_executor(); + } + template void operator()( WriteHandler&& h, - boost::shared_ptr const& sp, detail::opcode op, ping_data const& p) { @@ -265,7 +274,7 @@ struct stream:: ping_op< typename std::decay::type>( std::forward(h), - sp, + self, op, p); } @@ -336,9 +345,8 @@ async_ping(ping_data const& payload, PingHandler&& handler) return net::async_initiate< PingHandler, void(error_code)>( - run_ping_op{}, + run_ping_op{impl_}, handler, - impl_, detail::opcode::ping, payload); } @@ -354,9 +362,8 @@ async_pong(ping_data const& payload, PongHandler&& handler) return net::async_initiate< PongHandler, void(error_code)>( - run_ping_op{}, + run_ping_op{impl_}, handler, - impl_, detail::opcode::pong, payload); } diff --git a/include/boost/beast/websocket/impl/read.hpp b/include/boost/beast/websocket/impl/read.hpp index a81b13b4..037ad609 100644 --- a/include/boost/beast/websocket/impl/read.hpp +++ b/include/boost/beast/websocket/impl/read.hpp @@ -819,13 +819,22 @@ template struct stream:: run_read_some_op { + boost::shared_ptr const& self; + + using executor_type = typename stream::executor_type; + + executor_type + get_executor() const noexcept + { + return self->stream().get_executor(); + } + template< class ReadHandler, class MutableBufferSequence> void operator()( ReadHandler&& h, - boost::shared_ptr const& sp, MutableBufferSequence const& b) { // If you get an error on the following line it means @@ -841,7 +850,7 @@ struct stream:: typename std::decay::type, MutableBufferSequence>( std::forward(h), - sp, + self, b); } }; @@ -850,13 +859,22 @@ template struct stream:: run_read_op { + boost::shared_ptr const& self; + + using executor_type = typename stream::executor_type; + + executor_type + get_executor() const noexcept + { + return self->stream().get_executor(); + } + template< class ReadHandler, class DynamicBuffer> void operator()( ReadHandler&& h, - boost::shared_ptr const& sp, DynamicBuffer* b, std::size_t limit, bool some) @@ -874,7 +892,7 @@ struct stream:: typename std::decay::type, DynamicBuffer>( std::forward(h), - sp, + self, *b, limit, some); @@ -937,9 +955,8 @@ async_read(DynamicBuffer& buffer, ReadHandler&& handler) return net::async_initiate< ReadHandler, void(error_code, std::size_t)>( - run_read_op{}, + run_read_op{impl_}, handler, - impl_, &buffer, 0, false); @@ -1014,9 +1031,8 @@ async_read_some( return net::async_initiate< ReadHandler, void(error_code, std::size_t)>( - run_read_op{}, + run_read_op{impl_}, handler, - impl_, &buffer, limit, true); @@ -1395,9 +1411,8 @@ async_read_some( return net::async_initiate< ReadHandler, void(error_code, std::size_t)>( - run_read_some_op{}, + run_read_some_op{impl_}, handler, - impl_, buffers); } diff --git a/include/boost/beast/websocket/impl/write.hpp b/include/boost/beast/websocket/impl/write.hpp index 493572e4..78ae2913 100644 --- a/include/boost/beast/websocket/impl/write.hpp +++ b/include/boost/beast/websocket/impl/write.hpp @@ -559,13 +559,22 @@ template struct stream:: run_write_some_op { + boost::shared_ptr const& self; + + using executor_type = typename stream::executor_type; + + executor_type + get_executor() const noexcept + { + return self->stream().get_executor(); + } + template< class WriteHandler, class ConstBufferSequence> void operator()( WriteHandler&& h, - boost::shared_ptr const& sp, bool fin, ConstBufferSequence const& b) { @@ -582,7 +591,7 @@ struct stream:: typename std::decay::type, ConstBufferSequence>( std::forward(h), - sp, + self, fin, b); } @@ -836,9 +845,8 @@ async_write_some(bool fin, return net::async_initiate< WriteHandler, void(error_code, std::size_t)>( - run_write_some_op{}, + run_write_some_op{impl_}, handler, - impl_, fin, bs); } @@ -892,9 +900,8 @@ async_write( return net::async_initiate< WriteHandler, void(error_code, std::size_t)>( - run_write_some_op{}, + run_write_some_op{impl_}, handler, - impl_, true, bs); }