Skip to content

Commit

Permalink
Don't set non-blocking mode for async_wait operations.
Browse files Browse the repository at this point in the history
  • Loading branch information
chriskohlhoff committed Jul 7, 2024
1 parent c57701b commit b070ac3
Show file tree
Hide file tree
Showing 5 changed files with 60 additions and 47 deletions.
12 changes: 7 additions & 5 deletions asio/include/asio/detail/impl/reactive_descriptor_service.ipp
Original file line number Diff line number Diff line change
Expand Up @@ -198,18 +198,20 @@ asio::error_code reactive_descriptor_service::cancel(
}

void reactive_descriptor_service::do_start_op(implementation_type& impl,
int op_type, reactor_op* op, bool is_continuation, bool is_non_blocking,
bool noop, void (*on_immediate)(operation* op, bool, const void*),
int op_type, reactor_op* op, bool is_continuation,
bool allow_speculative, bool noop, bool needs_non_blocking,
void (*on_immediate)(operation* op, bool, const void*),
const void* immediate_arg)
{
if (!noop)
{
if ((impl.state_ & descriptor_ops::non_blocking) ||
descriptor_ops::set_internal_non_blocking(
if ((impl.state_ & descriptor_ops::non_blocking)
|| !needs_non_blocking
|| descriptor_ops::set_internal_non_blocking(
impl.descriptor_, impl.state_, true, op->ec_))
{
reactor_.start_op(op_type, impl.descriptor_, impl.reactor_data_, op,
is_continuation, is_non_blocking, on_immediate, immediate_arg);
is_continuation, allow_speculative, on_immediate, immediate_arg);
return;
}
}
Expand Down
10 changes: 6 additions & 4 deletions asio/include/asio/detail/impl/reactive_socket_service_base.ipp
Original file line number Diff line number Diff line change
Expand Up @@ -234,19 +234,21 @@ asio::error_code reactive_socket_service_base::do_assign(
}

void reactive_socket_service_base::do_start_op(
reactive_socket_service_base::base_implementation_type& impl, int op_type,
reactor_op* op, bool is_continuation, bool is_non_blocking, bool noop,
reactive_socket_service_base::base_implementation_type& impl,
int op_type, reactor_op* op, bool is_continuation,
bool allow_speculative, bool noop, bool needs_non_blocking,
void (*on_immediate)(operation* op, bool, const void*),
const void* immediate_arg)
{
if (!noop)
{
if ((impl.state_ & socket_ops::non_blocking)
|| !needs_non_blocking
|| socket_ops::set_internal_non_blocking(
impl.socket_, impl.state_, true, op->ec_))
{
reactor_.start_op(op_type, impl.socket_, impl.reactor_data_, op,
is_continuation, is_non_blocking, on_immediate, immediate_arg);
is_continuation, allow_speculative, on_immediate, immediate_arg);
return;
}
}
Expand All @@ -263,7 +265,7 @@ void reactive_socket_service_base::do_start_accept_op(
if (!peer_is_open)
{
do_start_op(impl, reactor::read_op, op, is_continuation,
true, false, on_immediate, immediate_arg);
true, false, true, on_immediate, immediate_arg);
}
else
{
Expand Down
36 changes: 20 additions & 16 deletions asio/include/asio/detail/reactive_descriptor_service.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -239,7 +239,7 @@ class reactive_descriptor_service :
default:
p.p->ec_ = asio::error::invalid_argument;
start_op(impl, reactor::read_op, p.p,
is_continuation, false, true, &io_ex, 0);
is_continuation, false, true, false, &io_ex, 0);
p.v = p.p = 0;
return;
}
Expand All @@ -252,7 +252,8 @@ class reactive_descriptor_service :
&reactor_, &impl.reactor_data_, impl.descriptor_, op_type);
}

start_op(impl, op_type, p.p, is_continuation, false, false, &io_ex, 0);
start_op(impl, op_type, p.p, is_continuation,
false, false, false, &io_ex, 0);
p.v = p.p = 0;
}

Expand Down Expand Up @@ -326,7 +327,7 @@ class reactive_descriptor_service :

start_op(impl, reactor::write_op, p.p, is_continuation, true,
buffer_sequence_adapter<asio::const_buffer,
ConstBufferSequence>::all_empty(buffers), &io_ex, 0);
ConstBufferSequence>::all_empty(buffers), true, &io_ex, 0);
p.v = p.p = 0;
}

Expand Down Expand Up @@ -360,7 +361,7 @@ class reactive_descriptor_service :
&impl, impl.descriptor_, "async_write_some(null_buffers)"));

start_op(impl, reactor::write_op, p.p,
is_continuation, false, false, &io_ex, 0);
is_continuation, false, false, false, &io_ex, 0);
p.v = p.p = 0;
}

Expand Down Expand Up @@ -435,7 +436,7 @@ class reactive_descriptor_service :

start_op(impl, reactor::read_op, p.p, is_continuation, true,
buffer_sequence_adapter<asio::mutable_buffer,
MutableBufferSequence>::all_empty(buffers), &io_ex, 0);
MutableBufferSequence>::all_empty(buffers), true, &io_ex, 0);
p.v = p.p = 0;
}

Expand Down Expand Up @@ -469,33 +470,35 @@ class reactive_descriptor_service :
&impl, impl.descriptor_, "async_read_some(null_buffers)"));

start_op(impl, reactor::read_op, p.p,
is_continuation, false, false, &io_ex, 0);
is_continuation, false, false, false, &io_ex, 0);
p.v = p.p = 0;
}

private:
// Start the asynchronous operation.
ASIO_DECL void do_start_op(implementation_type& impl, int op_type,
reactor_op* op, bool is_continuation, bool is_non_blocking, bool noop,
ASIO_DECL void do_start_op(implementation_type& impl,
int op_type, reactor_op* op, bool is_continuation,
bool allow_speculative, bool noop, bool needs_non_blocking,
void (*on_immediate)(operation* op, bool, const void*),
const void* immediate_arg);

// Start the asynchronous operation for handlers that are specialised for
// immediate completion.
template <typename Op>
void start_op(implementation_type& impl, int op_type, Op* op,
bool is_continuation, bool is_non_blocking, bool noop,
const void* io_ex, ...)
bool is_continuation, bool allow_speculative, bool noop,
bool needs_non_blocking, const void* io_ex, ...)
{
return do_start_op(impl, op_type, op, is_continuation,
is_non_blocking, noop, &Op::do_immediate, io_ex);
return do_start_op(impl, op_type, op, is_continuation, allow_speculative,
noop, needs_non_blocking, &Op::do_immediate, io_ex);
}

// Start the asynchronous operation for handlers that are not specialised for
// immediate completion.
template <typename Op>
void start_op(implementation_type& impl, int op_type, Op* op,
bool is_continuation, bool is_non_blocking, bool noop, const void*,
void start_op(implementation_type& impl, int op_type,
Op* op, bool is_continuation, bool allow_speculative,
bool noop, bool needs_non_blocking, const void*,
enable_if_t<
is_same<
typename associated_immediate_executor<
Expand All @@ -506,8 +509,9 @@ class reactive_descriptor_service :
>::value
>*)
{
return do_start_op(impl, op_type, op, is_continuation, is_non_blocking,
noop, &reactor::call_post_immediate_completion, &reactor_);
return do_start_op(impl, op_type, op, is_continuation,
allow_speculative, noop, needs_non_blocking,
&reactor::call_post_immediate_completion, &reactor_);
}

// Helper class used to implement per-operation cancellation
Expand Down
8 changes: 4 additions & 4 deletions asio/include/asio/detail/reactive_socket_service.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -307,7 +307,7 @@ class reactive_socket_service :
&impl, impl.socket_, "async_send_to"));

start_op(impl, reactor::write_op, p.p,
is_continuation, true, false, &io_ex, 0);
is_continuation, true, false, true, &io_ex, 0);
p.v = p.p = 0;
}

Expand Down Expand Up @@ -341,7 +341,7 @@ class reactive_socket_service :
&impl, impl.socket_, "async_send_to(null_buffers)"));

start_op(impl, reactor::write_op, p.p,
is_continuation, false, false, &io_ex, 0);
is_continuation, false, false, false, &io_ex, 0);
p.v = p.p = 0;
}

Expand Down Expand Up @@ -432,7 +432,7 @@ class reactive_socket_service :
start_op(impl,
(flags & socket_base::message_out_of_band)
? reactor::except_op : reactor::read_op,
p.p, is_continuation, true, false, &io_ex, 0);
p.p, is_continuation, true, false, true, &io_ex, 0);
p.v = p.p = 0;
}

Expand Down Expand Up @@ -471,7 +471,7 @@ class reactive_socket_service :
start_op(impl,
(flags & socket_base::message_out_of_band)
? reactor::except_op : reactor::read_op,
p.p, is_continuation, false, false, &io_ex, 0);
p.p, is_continuation, false, false, false, &io_ex, 0);
p.v = p.p = 0;
}

Expand Down
41 changes: 23 additions & 18 deletions asio/include/asio/detail/reactive_socket_service_base.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -229,7 +229,7 @@ class reactive_socket_service_base
default:
p.p->ec_ = asio::error::invalid_argument;
start_op(impl, reactor::read_op, p.p,
is_continuation, false, true, &io_ex, 0);
is_continuation, false, true, false, &io_ex, 0);
p.v = p.p = 0;
return;
}
Expand All @@ -242,7 +242,8 @@ class reactive_socket_service_base
&reactor_, &impl.reactor_data_, impl.socket_, op_type);
}

start_op(impl, op_type, p.p, is_continuation, false, false, &io_ex, 0);
start_op(impl, op_type, p.p, is_continuation,
false, false, false, &io_ex, 0);
p.v = p.p = 0;
}

Expand Down Expand Up @@ -314,7 +315,7 @@ class reactive_socket_service_base
start_op(impl, reactor::write_op, p.p, is_continuation, true,
((impl.state_ & socket_ops::stream_oriented)
&& buffer_sequence_adapter<asio::const_buffer,
ConstBufferSequence>::all_empty(buffers)), &io_ex, 0);
ConstBufferSequence>::all_empty(buffers)), true, &io_ex, 0);
p.v = p.p = 0;
}

Expand Down Expand Up @@ -347,7 +348,7 @@ class reactive_socket_service_base
&impl, impl.socket_, "async_send(null_buffers)"));

start_op(impl, reactor::write_op, p.p,
is_continuation, false, false, &io_ex, 0);
is_continuation, false, false, false, &io_ex, 0);
p.v = p.p = 0;
}

Expand Down Expand Up @@ -424,7 +425,7 @@ class reactive_socket_service_base
(flags & socket_base::message_out_of_band) == 0,
((impl.state_ & socket_ops::stream_oriented)
&& buffer_sequence_adapter<asio::mutable_buffer,
MutableBufferSequence>::all_empty(buffers)), &io_ex, 0);
MutableBufferSequence>::all_empty(buffers)), true, &io_ex, 0);
p.v = p.p = 0;
}

Expand Down Expand Up @@ -460,7 +461,7 @@ class reactive_socket_service_base
start_op(impl,
(flags & socket_base::message_out_of_band)
? reactor::except_op : reactor::read_op,
p.p, is_continuation, false, false, &io_ex, 0);
p.p, is_continuation, false, false, false, &io_ex, 0);
p.v = p.p = 0;
}

Expand Down Expand Up @@ -532,7 +533,8 @@ class reactive_socket_service_base
(in_flags & socket_base::message_out_of_band)
? reactor::except_op : reactor::read_op,
p.p, is_continuation,
(in_flags & socket_base::message_out_of_band) == 0, false, &io_ex, 0);
(in_flags & socket_base::message_out_of_band) == 0,
false, true, &io_ex, 0);
p.v = p.p = 0;
}

Expand Down Expand Up @@ -573,7 +575,7 @@ class reactive_socket_service_base
start_op(impl,
(in_flags & socket_base::message_out_of_band)
? reactor::except_op : reactor::read_op,
p.p, is_continuation, false, false, &io_ex, 0);
p.p, is_continuation, false, false, false, &io_ex, 0);
p.v = p.p = 0;
}

Expand All @@ -589,27 +591,29 @@ class reactive_socket_service_base
const native_handle_type& native_socket, asio::error_code& ec);

// Start the asynchronous read or write operation.
ASIO_DECL void do_start_op(base_implementation_type& impl, int op_type,
reactor_op* op, bool is_continuation, bool is_non_blocking, bool noop,
ASIO_DECL void do_start_op(base_implementation_type& impl,
int op_type, reactor_op* op, bool is_continuation,
bool allow_speculative, bool noop, bool needs_non_blocking,
void (*on_immediate)(operation* op, bool, const void*),
const void* immediate_arg);

// Start the asynchronous operation for handlers that are specialised for
// immediate completion.
template <typename Op>
void start_op(base_implementation_type& impl, int op_type, Op* op,
bool is_continuation, bool is_non_blocking, bool noop,
const void* io_ex, ...)
bool is_continuation, bool allow_speculative, bool noop,
bool needs_non_blocking, const void* io_ex, ...)
{
return do_start_op(impl, op_type, op, is_continuation,
is_non_blocking, noop, &Op::do_immediate, io_ex);
return do_start_op(impl, op_type, op, is_continuation, allow_speculative,
noop, needs_non_blocking, &Op::do_immediate, io_ex);
}

// Start the asynchronous operation for handlers that are not specialised for
// immediate completion.
template <typename Op>
void start_op(base_implementation_type& impl, int op_type, Op* op,
bool is_continuation, bool is_non_blocking, bool noop, const void*,
void start_op(base_implementation_type& impl, int op_type,
Op* op, bool is_continuation, bool allow_speculative,
bool noop, bool needs_non_blocking, const void*,
enable_if_t<
is_same<
typename associated_immediate_executor<
Expand All @@ -620,8 +624,9 @@ class reactive_socket_service_base
>::value
>*)
{
return do_start_op(impl, op_type, op, is_continuation, is_non_blocking,
noop, &reactor::call_post_immediate_completion, &reactor_);
return do_start_op(impl, op_type, op, is_continuation,
allow_speculative, noop, needs_non_blocking,
&reactor::call_post_immediate_completion, &reactor_);
}

// Start the asynchronous accept operation.
Expand Down

0 comments on commit b070ac3

Please sign in to comment.