From 1ea2d5330f7491b4eb49f0c2ed3155d22a17fe59 Mon Sep 17 00:00:00 2001 From: Christopher Kohlhoff Date: Tue, 30 Mar 2010 12:30:00 +0000 Subject: [PATCH] Don't perform a speculative read when an out-of-band read is pending. [SVN r60939] --- include/boost/asio/detail/dev_poll_reactor.hpp | 14 ++++++++------ include/boost/asio/detail/epoll_reactor.hpp | 4 +++- 2 files changed, 11 insertions(+), 7 deletions(-) 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()) {