diff --git a/include/boost/asio/detail/dev_poll_reactor.hpp b/include/boost/asio/detail/dev_poll_reactor.hpp index 873e4359..e00f501b 100644 --- a/include/boost/asio/detail/dev_poll_reactor.hpp +++ b/include/boost/asio/detail/dev_poll_reactor.hpp @@ -126,18 +126,20 @@ public: 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/include/boost/asio/detail/epoll_reactor.hpp b/include/boost/asio/detail/epoll_reactor.hpp index b07de7cc..46849448 100644 --- a/include/boost/asio/detail/epoll_reactor.hpp +++ b/include/boost/asio/detail/epoll_reactor.hpp @@ -180,7 +180,9 @@ public: 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()) {