Don't perform a speculative read when an out-of-band read is pending.
diff --git a/asio/include/asio/detail/dev_poll_reactor.hpp b/asio/include/asio/detail/dev_poll_reactor.hpp index bea199c..1367b71 100644 --- a/asio/include/asio/detail/dev_poll_reactor.hpp +++ b/asio/include/asio/detail/dev_poll_reactor.hpp
@@ -125,18 +125,20 @@ if (allow_speculative) { - if (!op_queue_[op_type].has_operation(descriptor)) + if (op_type != read_op || !op_queue_[except_op].has_operation(descriptor)) { - if (op->perform()) + if (!op_queue_[op_type].has_operation(descriptor)) { - lock.unlock(); - io_service_.post_immediate_completion(op); - return; + if (op->perform()) + { + lock.unlock(); + io_service_.post_immediate_completion(op); + return; + } } } } - bool first = op_queue_[op_type].enqueue_operation(descriptor, op); io_service_.work_started(); if (first)
diff --git a/asio/include/asio/detail/epoll_reactor.hpp b/asio/include/asio/detail/epoll_reactor.hpp index 0f21971..6367398 100644 --- a/asio/include/asio/detail/epoll_reactor.hpp +++ b/asio/include/asio/detail/epoll_reactor.hpp
@@ -179,7 +179,9 @@ if (descriptor_data->op_queue_[op_type].empty()) { - if (allow_speculative) + if (allow_speculative + && (op_type != read_op + || descriptor_data->op_queue_[except_op].empty())) { if (op->perform()) {