diff --git a/include/boost/asio/detail/descriptor_read_op.hpp b/include/boost/asio/detail/descriptor_read_op.hpp index f0b6be7b..f63fa4bf 100644 --- a/include/boost/asio/detail/descriptor_read_op.hpp +++ b/include/boost/asio/detail/descriptor_read_op.hpp @@ -37,9 +37,11 @@ template class descriptor_read_op_base : public reactor_op { public: - descriptor_read_op_base(int descriptor, - const MutableBufferSequence& buffers, func_type complete_func) - : reactor_op(&descriptor_read_op_base::do_perform, complete_func), + descriptor_read_op_base(const boost::system::error_code& success_ec, + int descriptor, const MutableBufferSequence& buffers, + func_type complete_func) + : reactor_op(success_ec, + &descriptor_read_op_base::do_perform, complete_func), descriptor_(descriptor), buffers_(buffers) { @@ -74,9 +76,10 @@ class descriptor_read_op public: BOOST_ASIO_DEFINE_HANDLER_PTR(descriptor_read_op); - descriptor_read_op(int descriptor, const MutableBufferSequence& buffers, + descriptor_read_op(const boost::system::error_code& success_ec, + int descriptor, const MutableBufferSequence& buffers, Handler& handler, const IoExecutor& io_ex) - : descriptor_read_op_base( + : descriptor_read_op_base(success_ec, descriptor, buffers, &descriptor_read_op::do_complete), handler_(BOOST_ASIO_MOVE_CAST(Handler)(handler)), io_executor_(io_ex) diff --git a/include/boost/asio/detail/descriptor_write_op.hpp b/include/boost/asio/detail/descriptor_write_op.hpp index abc36a5b..94759d03 100644 --- a/include/boost/asio/detail/descriptor_write_op.hpp +++ b/include/boost/asio/detail/descriptor_write_op.hpp @@ -37,9 +37,11 @@ template class descriptor_write_op_base : public reactor_op { public: - descriptor_write_op_base(int descriptor, - const ConstBufferSequence& buffers, func_type complete_func) - : reactor_op(&descriptor_write_op_base::do_perform, complete_func), + descriptor_write_op_base(const boost::system::error_code& success_ec, + int descriptor, const ConstBufferSequence& buffers, + func_type complete_func) + : reactor_op(success_ec, + &descriptor_write_op_base::do_perform, complete_func), descriptor_(descriptor), buffers_(buffers) { @@ -74,9 +76,10 @@ class descriptor_write_op public: BOOST_ASIO_DEFINE_HANDLER_PTR(descriptor_write_op); - descriptor_write_op(int descriptor, const ConstBufferSequence& buffers, + descriptor_write_op(const boost::system::error_code& success_ec, + int descriptor, const ConstBufferSequence& buffers, Handler& handler, const IoExecutor& io_ex) - : descriptor_write_op_base( + : descriptor_write_op_base(success_ec, descriptor, buffers, &descriptor_write_op::do_complete), handler_(BOOST_ASIO_MOVE_CAST(Handler)(handler)), io_executor_(io_ex) diff --git a/include/boost/asio/detail/impl/signal_set_service.ipp b/include/boost/asio/detail/impl/signal_set_service.ipp index b4e45686..421f8387 100644 --- a/include/boost/asio/detail/impl/signal_set_service.ipp +++ b/include/boost/asio/detail/impl/signal_set_service.ipp @@ -90,7 +90,8 @@ class signal_set_service::pipe_read_op : public reactor_op { public: pipe_read_op() - : reactor_op(&pipe_read_op::do_perform, pipe_read_op::do_complete) + : reactor_op(boost::system::error_code(), + &pipe_read_op::do_perform, pipe_read_op::do_complete) { } diff --git a/include/boost/asio/detail/reactive_descriptor_service.hpp b/include/boost/asio/detail/reactive_descriptor_service.hpp index bdd3a426..9c91e7cb 100644 --- a/include/boost/asio/detail/reactive_descriptor_service.hpp +++ b/include/boost/asio/detail/reactive_descriptor_service.hpp @@ -202,7 +202,7 @@ public: typedef reactive_wait_op op; typename op::ptr p = { boost::asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; - p.p = new (p.v) op(handler, io_ex); + p.p = new (p.v) op(success_ec_, handler, io_ex); BOOST_ASIO_HANDLER_CREATION((reactor_.context(), *p.p, "descriptor", &impl, impl.descriptor_, "async_wait")); @@ -266,7 +266,7 @@ public: typedef descriptor_write_op op; typename op::ptr p = { boost::asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; - p.p = new (p.v) op(impl.descriptor_, buffers, handler, io_ex); + p.p = new (p.v) op(success_ec_, impl.descriptor_, buffers, handler, io_ex); BOOST_ASIO_HANDLER_CREATION((reactor_.context(), *p.p, "descriptor", &impl, impl.descriptor_, "async_write_some")); @@ -289,7 +289,7 @@ public: typedef reactive_null_buffers_op op; typename op::ptr p = { boost::asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; - p.p = new (p.v) op(handler, io_ex); + p.p = new (p.v) op(success_ec_, handler, io_ex); BOOST_ASIO_HANDLER_CREATION((reactor_.context(), *p.p, "descriptor", &impl, impl.descriptor_, "async_write_some(null_buffers)")); @@ -335,7 +335,7 @@ public: typedef descriptor_read_op op; typename op::ptr p = { boost::asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; - p.p = new (p.v) op(impl.descriptor_, buffers, handler, io_ex); + p.p = new (p.v) op(success_ec_, impl.descriptor_, buffers, handler, io_ex); BOOST_ASIO_HANDLER_CREATION((reactor_.context(), *p.p, "descriptor", &impl, impl.descriptor_, "async_read_some")); @@ -358,7 +358,7 @@ public: typedef reactive_null_buffers_op op; typename op::ptr p = { boost::asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; - p.p = new (p.v) op(handler, io_ex); + p.p = new (p.v) op(success_ec_, handler, io_ex); BOOST_ASIO_HANDLER_CREATION((reactor_.context(), *p.p, "descriptor", &impl, impl.descriptor_, "async_read_some(null_buffers)")); @@ -374,6 +374,9 @@ private: // The selector that performs event demultiplexing for the service. reactor& reactor_; + + // Cached success value to avoid accessing category singleton. + const boost::system::error_code success_ec_; }; } // namespace detail diff --git a/include/boost/asio/detail/reactive_null_buffers_op.hpp b/include/boost/asio/detail/reactive_null_buffers_op.hpp index efa91902..ecdca8b5 100644 --- a/include/boost/asio/detail/reactive_null_buffers_op.hpp +++ b/include/boost/asio/detail/reactive_null_buffers_op.hpp @@ -34,8 +34,9 @@ class reactive_null_buffers_op : public reactor_op public: BOOST_ASIO_DEFINE_HANDLER_PTR(reactive_null_buffers_op); - reactive_null_buffers_op(Handler& handler, const IoExecutor& io_ex) - : reactor_op(&reactive_null_buffers_op::do_perform, + reactive_null_buffers_op(const boost::system::error_code& success_ec, + Handler& handler, const IoExecutor& io_ex) + : reactor_op(success_ec, &reactive_null_buffers_op::do_perform, &reactive_null_buffers_op::do_complete), handler_(BOOST_ASIO_MOVE_CAST(Handler)(handler)), io_executor_(io_ex) diff --git a/include/boost/asio/detail/reactive_socket_accept_op.hpp b/include/boost/asio/detail/reactive_socket_accept_op.hpp index f182caa7..b2e84dd7 100644 --- a/include/boost/asio/detail/reactive_socket_accept_op.hpp +++ b/include/boost/asio/detail/reactive_socket_accept_op.hpp @@ -34,10 +34,12 @@ template class reactive_socket_accept_op_base : public reactor_op { public: - reactive_socket_accept_op_base(socket_type socket, - socket_ops::state_type state, Socket& peer, const Protocol& protocol, - typename Protocol::endpoint* peer_endpoint, func_type complete_func) - : reactor_op(&reactive_socket_accept_op_base::do_perform, complete_func), + reactive_socket_accept_op_base(const boost::system::error_code& success_ec, + socket_type socket, socket_ops::state_type state, Socket& peer, + const Protocol& protocol, typename Protocol::endpoint* peer_endpoint, + func_type complete_func) + : reactor_op(success_ec, + &reactive_socket_accept_op_base::do_perform, complete_func), socket_(socket), state_(state), peer_(peer), @@ -94,12 +96,13 @@ class reactive_socket_accept_op : public: BOOST_ASIO_DEFINE_HANDLER_PTR(reactive_socket_accept_op); - reactive_socket_accept_op(socket_type socket, - socket_ops::state_type state, Socket& peer, const Protocol& protocol, - typename Protocol::endpoint* peer_endpoint, Handler& handler, - const IoExecutor& io_ex) - : reactive_socket_accept_op_base(socket, state, peer, - protocol, peer_endpoint, &reactive_socket_accept_op::do_complete), + reactive_socket_accept_op(const boost::system::error_code& success_ec, + socket_type socket, socket_ops::state_type state, Socket& peer, + const Protocol& protocol, typename Protocol::endpoint* peer_endpoint, + Handler& handler, const IoExecutor& io_ex) + : reactive_socket_accept_op_base( + success_ec, socket, state, peer, protocol, peer_endpoint, + &reactive_socket_accept_op::do_complete), handler_(BOOST_ASIO_MOVE_CAST(Handler)(handler)), io_executor_(io_ex) { @@ -160,13 +163,14 @@ class reactive_socket_move_accept_op : public: BOOST_ASIO_DEFINE_HANDLER_PTR(reactive_socket_move_accept_op); - reactive_socket_move_accept_op(const PeerIoExecutor& peer_io_ex, - socket_type socket, socket_ops::state_type state, - const Protocol& protocol, typename Protocol::endpoint* peer_endpoint, - Handler& handler, const IoExecutor& io_ex) + reactive_socket_move_accept_op(const boost::system::error_code& success_ec, + const PeerIoExecutor& peer_io_ex, socket_type socket, + socket_ops::state_type state, const Protocol& protocol, + typename Protocol::endpoint* peer_endpoint, Handler& handler, + const IoExecutor& io_ex) : peer_socket_type(peer_io_ex), reactive_socket_accept_op_base( - socket, state, *this, protocol, peer_endpoint, + success_ec, socket, state, *this, protocol, peer_endpoint, &reactive_socket_move_accept_op::do_complete), handler_(BOOST_ASIO_MOVE_CAST(Handler)(handler)), io_executor_(io_ex) diff --git a/include/boost/asio/detail/reactive_socket_connect_op.hpp b/include/boost/asio/detail/reactive_socket_connect_op.hpp index b0a31c08..f5162765 100644 --- a/include/boost/asio/detail/reactive_socket_connect_op.hpp +++ b/include/boost/asio/detail/reactive_socket_connect_op.hpp @@ -32,8 +32,10 @@ namespace detail { class reactive_socket_connect_op_base : public reactor_op { public: - reactive_socket_connect_op_base(socket_type socket, func_type complete_func) - : reactor_op(&reactive_socket_connect_op_base::do_perform, complete_func), + reactive_socket_connect_op_base(const boost::system::error_code& success_ec, + socket_type socket, func_type complete_func) + : reactor_op(success_ec, + &reactive_socket_connect_op_base::do_perform, complete_func), socket_(socket) { } @@ -61,9 +63,9 @@ class reactive_socket_connect_op : public reactive_socket_connect_op_base public: BOOST_ASIO_DEFINE_HANDLER_PTR(reactive_socket_connect_op); - reactive_socket_connect_op(socket_type socket, - Handler& handler, const IoExecutor& io_ex) - : reactive_socket_connect_op_base(socket, + reactive_socket_connect_op(const boost::system::error_code& success_ec, + socket_type socket, Handler& handler, const IoExecutor& io_ex) + : reactive_socket_connect_op_base(success_ec, socket, &reactive_socket_connect_op::do_complete), handler_(BOOST_ASIO_MOVE_CAST(Handler)(handler)), io_executor_(io_ex) diff --git a/include/boost/asio/detail/reactive_socket_recv_op.hpp b/include/boost/asio/detail/reactive_socket_recv_op.hpp index e0e43c84..5d834a5c 100644 --- a/include/boost/asio/detail/reactive_socket_recv_op.hpp +++ b/include/boost/asio/detail/reactive_socket_recv_op.hpp @@ -33,10 +33,12 @@ template class reactive_socket_recv_op_base : public reactor_op { public: - reactive_socket_recv_op_base(socket_type socket, - socket_ops::state_type state, const MutableBufferSequence& buffers, + reactive_socket_recv_op_base(const boost::system::error_code& success_ec, + socket_type socket, socket_ops::state_type state, + const MutableBufferSequence& buffers, socket_base::message_flags flags, func_type complete_func) - : reactor_op(&reactive_socket_recv_op_base::do_perform, complete_func), + : reactor_op(success_ec, + &reactive_socket_recv_op_base::do_perform, complete_func), socket_(socket), state_(state), buffers_(buffers), @@ -95,11 +97,12 @@ class reactive_socket_recv_op : public: BOOST_ASIO_DEFINE_HANDLER_PTR(reactive_socket_recv_op); - reactive_socket_recv_op(socket_type socket, socket_ops::state_type state, + reactive_socket_recv_op(const boost::system::error_code& success_ec, + socket_type socket, socket_ops::state_type state, const MutableBufferSequence& buffers, socket_base::message_flags flags, Handler& handler, const IoExecutor& io_ex) - : reactive_socket_recv_op_base(socket, state, - buffers, flags, &reactive_socket_recv_op::do_complete), + : reactive_socket_recv_op_base(success_ec, socket, + state, buffers, flags, &reactive_socket_recv_op::do_complete), handler_(BOOST_ASIO_MOVE_CAST(Handler)(handler)), io_executor_(io_ex) { diff --git a/include/boost/asio/detail/reactive_socket_recvfrom_op.hpp b/include/boost/asio/detail/reactive_socket_recvfrom_op.hpp index 9f641d58..17554000 100644 --- a/include/boost/asio/detail/reactive_socket_recvfrom_op.hpp +++ b/include/boost/asio/detail/reactive_socket_recvfrom_op.hpp @@ -33,10 +33,12 @@ template class reactive_socket_recvfrom_op_base : public reactor_op { public: - reactive_socket_recvfrom_op_base(socket_type socket, int protocol_type, + reactive_socket_recvfrom_op_base(const boost::system::error_code& success_ec, + socket_type socket, int protocol_type, const MutableBufferSequence& buffers, Endpoint& endpoint, socket_base::message_flags flags, func_type complete_func) - : reactor_op(&reactive_socket_recvfrom_op_base::do_perform, complete_func), + : reactor_op(success_ec, + &reactive_socket_recvfrom_op_base::do_perform, complete_func), socket_(socket), protocol_type_(protocol_type), buffers_(buffers), @@ -84,12 +86,13 @@ class reactive_socket_recvfrom_op : public: BOOST_ASIO_DEFINE_HANDLER_PTR(reactive_socket_recvfrom_op); - reactive_socket_recvfrom_op(socket_type socket, int protocol_type, + reactive_socket_recvfrom_op(const boost::system::error_code& success_ec, + socket_type socket, int protocol_type, const MutableBufferSequence& buffers, Endpoint& endpoint, socket_base::message_flags flags, Handler& handler, const IoExecutor& io_ex) : reactive_socket_recvfrom_op_base( - socket, protocol_type, buffers, endpoint, flags, + success_ec, socket, protocol_type, buffers, endpoint, flags, &reactive_socket_recvfrom_op::do_complete), handler_(BOOST_ASIO_MOVE_CAST(Handler)(handler)), io_executor_(io_ex) diff --git a/include/boost/asio/detail/reactive_socket_recvmsg_op.hpp b/include/boost/asio/detail/reactive_socket_recvmsg_op.hpp index d4472c49..1f1b2df1 100644 --- a/include/boost/asio/detail/reactive_socket_recvmsg_op.hpp +++ b/include/boost/asio/detail/reactive_socket_recvmsg_op.hpp @@ -34,10 +34,12 @@ template class reactive_socket_recvmsg_op_base : public reactor_op { public: - reactive_socket_recvmsg_op_base(socket_type socket, - const MutableBufferSequence& buffers, socket_base::message_flags in_flags, + reactive_socket_recvmsg_op_base(const boost::system::error_code& success_ec, + socket_type socket, const MutableBufferSequence& buffers, + socket_base::message_flags in_flags, socket_base::message_flags& out_flags, func_type complete_func) - : reactor_op(&reactive_socket_recvmsg_op_base::do_perform, complete_func), + : reactor_op(success_ec, + &reactive_socket_recvmsg_op_base::do_perform, complete_func), socket_(socket), buffers_(buffers), in_flags_(in_flags), @@ -78,12 +80,14 @@ class reactive_socket_recvmsg_op : public: BOOST_ASIO_DEFINE_HANDLER_PTR(reactive_socket_recvmsg_op); - reactive_socket_recvmsg_op(socket_type socket, - const MutableBufferSequence& buffers, socket_base::message_flags in_flags, + reactive_socket_recvmsg_op(const boost::system::error_code& success_ec, + socket_type socket, const MutableBufferSequence& buffers, + socket_base::message_flags in_flags, socket_base::message_flags& out_flags, Handler& handler, const IoExecutor& io_ex) - : reactive_socket_recvmsg_op_base(socket, buffers, - in_flags, out_flags, &reactive_socket_recvmsg_op::do_complete), + : reactive_socket_recvmsg_op_base( + success_ec, socket, buffers, in_flags, out_flags, + &reactive_socket_recvmsg_op::do_complete), handler_(BOOST_ASIO_MOVE_CAST(Handler)(handler)), io_executor_(io_ex) { diff --git a/include/boost/asio/detail/reactive_socket_send_op.hpp b/include/boost/asio/detail/reactive_socket_send_op.hpp index 031d01c3..e38b9d08 100644 --- a/include/boost/asio/detail/reactive_socket_send_op.hpp +++ b/include/boost/asio/detail/reactive_socket_send_op.hpp @@ -33,10 +33,12 @@ template class reactive_socket_send_op_base : public reactor_op { public: - reactive_socket_send_op_base(socket_type socket, - socket_ops::state_type state, const ConstBufferSequence& buffers, + reactive_socket_send_op_base(const boost::system::error_code& success_ec, + socket_type socket, socket_ops::state_type state, + const ConstBufferSequence& buffers, socket_base::message_flags flags, func_type complete_func) - : reactor_op(&reactive_socket_send_op_base::do_perform, complete_func), + : reactor_op(success_ec, + &reactive_socket_send_op_base::do_perform, complete_func), socket_(socket), state_(state), buffers_(buffers), @@ -98,10 +100,11 @@ class reactive_socket_send_op : public: BOOST_ASIO_DEFINE_HANDLER_PTR(reactive_socket_send_op); - reactive_socket_send_op(socket_type socket, socket_ops::state_type state, + reactive_socket_send_op(const boost::system::error_code& success_ec, + socket_type socket, socket_ops::state_type state, const ConstBufferSequence& buffers, socket_base::message_flags flags, Handler& handler, const IoExecutor& io_ex) - : reactive_socket_send_op_base(socket, + : reactive_socket_send_op_base(success_ec, socket, state, buffers, flags, &reactive_socket_send_op::do_complete), handler_(BOOST_ASIO_MOVE_CAST(Handler)(handler)), io_executor_(io_ex) diff --git a/include/boost/asio/detail/reactive_socket_sendto_op.hpp b/include/boost/asio/detail/reactive_socket_sendto_op.hpp index a4366ddd..c4b5c454 100644 --- a/include/boost/asio/detail/reactive_socket_sendto_op.hpp +++ b/include/boost/asio/detail/reactive_socket_sendto_op.hpp @@ -33,10 +33,12 @@ template class reactive_socket_sendto_op_base : public reactor_op { public: - reactive_socket_sendto_op_base(socket_type socket, - const ConstBufferSequence& buffers, const Endpoint& endpoint, - socket_base::message_flags flags, func_type complete_func) - : reactor_op(&reactive_socket_sendto_op_base::do_perform, complete_func), + reactive_socket_sendto_op_base(const boost::system::error_code& success_ec, + socket_type socket, const ConstBufferSequence& buffers, + const Endpoint& endpoint, socket_base::message_flags flags, + func_type complete_func) + : reactor_op(success_ec, + &reactive_socket_sendto_op_base::do_perform, complete_func), socket_(socket), buffers_(buffers), destination_(endpoint), @@ -78,12 +80,13 @@ class reactive_socket_sendto_op : public: BOOST_ASIO_DEFINE_HANDLER_PTR(reactive_socket_sendto_op); - reactive_socket_sendto_op(socket_type socket, - const ConstBufferSequence& buffers, const Endpoint& endpoint, - socket_base::message_flags flags, Handler& handler, - const IoExecutor& io_ex) - : reactive_socket_sendto_op_base(socket, - buffers, endpoint, flags, &reactive_socket_sendto_op::do_complete), + reactive_socket_sendto_op(const boost::system::error_code& success_ec, + socket_type socket, const ConstBufferSequence& buffers, + const Endpoint& endpoint, socket_base::message_flags flags, + Handler& handler, const IoExecutor& io_ex) + : reactive_socket_sendto_op_base( + success_ec, socket, buffers, endpoint, flags, + &reactive_socket_sendto_op::do_complete), handler_(BOOST_ASIO_MOVE_CAST(Handler)(handler)), io_executor_(io_ex) { diff --git a/include/boost/asio/detail/reactive_socket_service.hpp b/include/boost/asio/detail/reactive_socket_service.hpp index 9cc0db30..01249521 100644 --- a/include/boost/asio/detail/reactive_socket_service.hpp +++ b/include/boost/asio/detail/reactive_socket_service.hpp @@ -255,8 +255,8 @@ public: endpoint_type, Handler, IoExecutor> op; typename op::ptr p = { boost::asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; - p.p = new (p.v) op(impl.socket_, buffers, - destination, flags, handler, io_ex); + p.p = new (p.v) op(success_ec_, impl.socket_, + buffers, destination, flags, handler, io_ex); BOOST_ASIO_HANDLER_CREATION((reactor_.context(), *p.p, "socket", &impl, impl.socket_, "async_send_to")); @@ -278,7 +278,7 @@ public: typedef reactive_null_buffers_op op; typename op::ptr p = { boost::asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; - p.p = new (p.v) op(handler, io_ex); + p.p = new (p.v) op(success_ec_, handler, io_ex); BOOST_ASIO_HANDLER_CREATION((reactor_.context(), *p.p, "socket", &impl, impl.socket_, "async_send_to(null_buffers)")); @@ -342,8 +342,8 @@ public: typename op::ptr p = { boost::asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; int protocol = impl.protocol_.type(); - p.p = new (p.v) op(impl.socket_, protocol, buffers, - sender_endpoint, flags, handler, io_ex); + p.p = new (p.v) op(success_ec_, impl.socket_, protocol, + buffers, sender_endpoint, flags, handler, io_ex); BOOST_ASIO_HANDLER_CREATION((reactor_.context(), *p.p, "socket", &impl, impl.socket_, "async_receive_from")); @@ -368,7 +368,7 @@ public: typedef reactive_null_buffers_op op; typename op::ptr p = { boost::asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; - p.p = new (p.v) op(handler, io_ex); + p.p = new (p.v) op(success_ec_, handler, io_ex); BOOST_ASIO_HANDLER_CREATION((reactor_.context(), *p.p, "socket", &impl, impl.socket_, "async_receive_from(null_buffers)")); @@ -426,8 +426,8 @@ public: typedef reactive_socket_accept_op op; typename op::ptr p = { boost::asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; - p.p = new (p.v) op(impl.socket_, impl.state_, peer, - impl.protocol_, peer_endpoint, handler, io_ex); + p.p = new (p.v) op(success_ec_, impl.socket_, impl.state_, + peer, impl.protocol_, peer_endpoint, handler, io_ex); BOOST_ASIO_HANDLER_CREATION((reactor_.context(), *p.p, "socket", &impl, impl.socket_, "async_accept")); @@ -452,8 +452,8 @@ public: PeerIoExecutor, Handler, IoExecutor> op; typename op::ptr p = { boost::asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; - p.p = new (p.v) op(peer_io_ex, impl.socket_, impl.state_, - impl.protocol_, peer_endpoint, handler, io_ex); + p.p = new (p.v) op(success_ec_, peer_io_ex, impl.socket_, + impl.state_, impl.protocol_, peer_endpoint, handler, io_ex); BOOST_ASIO_HANDLER_CREATION((reactor_.context(), *p.p, "socket", &impl, impl.socket_, "async_accept")); @@ -485,7 +485,7 @@ public: typedef reactive_socket_connect_op op; typename op::ptr p = { boost::asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; - p.p = new (p.v) op(impl.socket_, handler, io_ex); + p.p = new (p.v) op(success_ec_, impl.socket_, handler, io_ex); BOOST_ASIO_HANDLER_CREATION((reactor_.context(), *p.p, "socket", &impl, impl.socket_, "async_connect")); diff --git a/include/boost/asio/detail/reactive_socket_service_base.hpp b/include/boost/asio/detail/reactive_socket_service_base.hpp index 5ed63dde..29b379f0 100644 --- a/include/boost/asio/detail/reactive_socket_service_base.hpp +++ b/include/boost/asio/detail/reactive_socket_service_base.hpp @@ -204,7 +204,7 @@ public: typedef reactive_wait_op op; typename op::ptr p = { boost::asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; - p.p = new (p.v) op(handler, io_ex); + p.p = new (p.v) op(success_ec_, handler, io_ex); BOOST_ASIO_HANDLER_CREATION((reactor_.context(), *p.p, "socket", &impl, impl.socket_, "async_wait")); @@ -280,8 +280,8 @@ public: ConstBufferSequence, Handler, IoExecutor> op; typename op::ptr p = { boost::asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; - p.p = new (p.v) op(impl.socket_, impl.state_, - buffers, flags, handler, io_ex); + p.p = new (p.v) op(success_ec_, impl.socket_, + impl.state_, buffers, flags, handler, io_ex); BOOST_ASIO_HANDLER_CREATION((reactor_.context(), *p.p, "socket", &impl, impl.socket_, "async_send")); @@ -305,7 +305,7 @@ public: typedef reactive_null_buffers_op op; typename op::ptr p = { boost::asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; - p.p = new (p.v) op(handler, io_ex); + p.p = new (p.v) op(success_ec_, handler, io_ex); BOOST_ASIO_HANDLER_CREATION((reactor_.context(), *p.p, "socket", &impl, impl.socket_, "async_send(null_buffers)")); @@ -363,8 +363,8 @@ public: MutableBufferSequence, Handler, IoExecutor> op; typename op::ptr p = { boost::asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; - p.p = new (p.v) op(impl.socket_, impl.state_, - buffers, flags, handler, io_ex); + p.p = new (p.v) op(success_ec_, impl.socket_, + impl.state_, buffers, flags, handler, io_ex); BOOST_ASIO_HANDLER_CREATION((reactor_.context(), *p.p, "socket", &impl, impl.socket_, "async_receive")); @@ -393,7 +393,7 @@ public: typedef reactive_null_buffers_op op; typename op::ptr p = { boost::asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; - p.p = new (p.v) op(handler, io_ex); + p.p = new (p.v) op(success_ec_, handler, io_ex); BOOST_ASIO_HANDLER_CREATION((reactor_.context(), *p.p, "socket", &impl, impl.socket_, "async_receive(null_buffers)")); @@ -452,8 +452,8 @@ public: MutableBufferSequence, Handler, IoExecutor> op; typename op::ptr p = { boost::asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; - p.p = new (p.v) op(impl.socket_, buffers, - in_flags, out_flags, handler, io_ex); + p.p = new (p.v) op(success_ec_, impl.socket_, + buffers, in_flags, out_flags, handler, io_ex); BOOST_ASIO_HANDLER_CREATION((reactor_.context(), *p.p, "socket", &impl, impl.socket_, "async_receive_with_flags")); @@ -480,7 +480,7 @@ public: typedef reactive_null_buffers_op op; typename op::ptr p = { boost::asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; - p.p = new (p.v) op(handler, io_ex); + p.p = new (p.v) op(success_ec_, handler, io_ex); BOOST_ASIO_HANDLER_CREATION((reactor_.context(), *p.p, "socket", &impl, impl.socket_, "async_receive_with_flags(null_buffers)")); @@ -522,6 +522,9 @@ protected: // The selector that performs event demultiplexing for the service. reactor& reactor_; + + // Cached success value to avoid accessing category singleton. + const boost::system::error_code success_ec_; }; } // namespace detail diff --git a/include/boost/asio/detail/reactive_wait_op.hpp b/include/boost/asio/detail/reactive_wait_op.hpp index f8b1b18d..023e9c44 100644 --- a/include/boost/asio/detail/reactive_wait_op.hpp +++ b/include/boost/asio/detail/reactive_wait_op.hpp @@ -34,8 +34,9 @@ class reactive_wait_op : public reactor_op public: BOOST_ASIO_DEFINE_HANDLER_PTR(reactive_wait_op); - reactive_wait_op(Handler& handler, const IoExecutor& io_ex) - : reactor_op(&reactive_wait_op::do_perform, + reactive_wait_op(const boost::system::error_code& success_ec, + Handler& handler, const IoExecutor& io_ex) + : reactor_op(success_ec, &reactive_wait_op::do_perform, &reactive_wait_op::do_complete), handler_(BOOST_ASIO_MOVE_CAST(Handler)(handler)), io_executor_(io_ex) diff --git a/include/boost/asio/detail/reactor_op.hpp b/include/boost/asio/detail/reactor_op.hpp index 4ec24326..5985e935 100644 --- a/include/boost/asio/detail/reactor_op.hpp +++ b/include/boost/asio/detail/reactor_op.hpp @@ -47,8 +47,10 @@ public: protected: typedef status (*perform_func_type)(reactor_op*); - reactor_op(perform_func_type perform_func, func_type complete_func) + reactor_op(const boost::system::error_code& success_ec, + perform_func_type perform_func, func_type complete_func) : operation(complete_func), + ec_(success_ec), bytes_transferred_(0), perform_func_(perform_func) { diff --git a/include/boost/asio/detail/win_iocp_null_buffers_op.hpp b/include/boost/asio/detail/win_iocp_null_buffers_op.hpp index f0615659..335f0269 100644 --- a/include/boost/asio/detail/win_iocp_null_buffers_op.hpp +++ b/include/boost/asio/detail/win_iocp_null_buffers_op.hpp @@ -43,7 +43,8 @@ public: win_iocp_null_buffers_op(socket_ops::weak_cancel_token_type cancel_token, Handler& handler, const IoExecutor& io_ex) - : reactor_op(&win_iocp_null_buffers_op::do_perform, + : reactor_op(boost::system::error_code(), + &win_iocp_null_buffers_op::do_perform, &win_iocp_null_buffers_op::do_complete), cancel_token_(cancel_token), handler_(BOOST_ASIO_MOVE_CAST(Handler)(handler)), diff --git a/include/boost/asio/detail/win_iocp_socket_connect_op.hpp b/include/boost/asio/detail/win_iocp_socket_connect_op.hpp index 5b53fe25..25319303 100644 --- a/include/boost/asio/detail/win_iocp_socket_connect_op.hpp +++ b/include/boost/asio/detail/win_iocp_socket_connect_op.hpp @@ -38,7 +38,8 @@ class win_iocp_socket_connect_op_base : public reactor_op { public: win_iocp_socket_connect_op_base(socket_type socket, func_type complete_func) - : reactor_op(&win_iocp_socket_connect_op_base::do_perform, complete_func), + : reactor_op(boost::system::error_code(), + &win_iocp_socket_connect_op_base::do_perform, complete_func), socket_(socket), connect_ex_(false) { diff --git a/include/boost/asio/detail/win_iocp_wait_op.hpp b/include/boost/asio/detail/win_iocp_wait_op.hpp index bf93e4a6..41ee2624 100644 --- a/include/boost/asio/detail/win_iocp_wait_op.hpp +++ b/include/boost/asio/detail/win_iocp_wait_op.hpp @@ -43,7 +43,8 @@ public: win_iocp_wait_op(socket_ops::weak_cancel_token_type cancel_token, Handler& handler, const IoExecutor& io_ex) - : reactor_op(&win_iocp_wait_op::do_perform, + : reactor_op(boost::system::error_code(), + &win_iocp_wait_op::do_perform, &win_iocp_wait_op::do_complete), cancel_token_(cancel_token), handler_(BOOST_ASIO_MOVE_CAST(Handler)(handler)),