From 2207e8e5f34965d8f7b757ba8792cbbe9588ef87 Mon Sep 17 00:00:00 2001 From: Avi Kivity Date: Mon, 18 Aug 2014 16:59:25 +0300 Subject: [PATCH] Add make_ready_future() helper when no async work needs to be done Use where applicable. --- httpd.cc | 7 +++---- reactor.cc | 4 +--- reactor.hh | 39 +++++++++++++++++++++++++++++++-------- 3 files changed, 35 insertions(+), 15 deletions(-) diff --git a/httpd.cc b/httpd.cc index 52c7b09749..583eb4a6bb 100644 --- a/httpd.cc +++ b/httpd.cc @@ -147,12 +147,11 @@ public: }); } future write_response_headers(std::unordered_map::iterator hi) { + if (hi == _resp->_headers.end()) { + return make_ready_future(0); + } promise pr; auto fut = pr.get_future(); - if (hi == _resp->_headers.end()) { - pr.set_value(0); - return fut; - } _write_buf.write(hi->first.begin(), hi->first.size()).then( [hi, this, pr = std::move(pr)] (size_t done) mutable { return _write_buf.write(": ", 2); diff --git a/reactor.cc b/reactor.cc index c50847f7be..84f15fffef 100644 --- a/reactor.cc +++ b/reactor.cc @@ -23,9 +23,7 @@ future reactor::get_epoll_future(pollable_fd_state& pfd, promise pollable_fd_state::*pr, int event) { if (pfd.events_known & event) { pfd.events_known &= ~event; - promise pr; - pr.set_value(); - return pr.get_future(); + return make_ready_future(); } pfd.events_requested |= event; if (!(pfd.events_epoll & event)) { diff --git a/reactor.hh b/reactor.hh index 330c763b54..224c3f71bb 100644 --- a/reactor.hh +++ b/reactor.hh @@ -52,6 +52,11 @@ class promise; template class future; +template +future make_ready_future(T&& value); + +future make_ready_future(); + class task { public: virtual ~task() {} @@ -157,6 +162,7 @@ struct future_state { make_ready(); } } + friend future make_ready_future(T&& value); }; template <> @@ -219,6 +225,7 @@ struct future_state { make_ready(); } } + friend future make_ready_future(); }; template @@ -335,6 +342,7 @@ public: } friend class promise; + friend future make_ready_future(T&& value); }; template <> @@ -398,6 +406,7 @@ public: } friend class promise; + friend future make_ready_future(); }; template @@ -417,6 +426,21 @@ promise::get_future() return future(_state); } +template +inline +future make_ready_future(T&& value) { + auto s = new future_state(); + s->set(std::move(value)); + return future(s); +} + +inline +future make_ready_future() { + auto s = new future_state(); + s->set(); + return future(s); +} + using accept_result = std::tuple; struct listen_options { @@ -850,17 +874,16 @@ output_stream_buffer::write(const char_type* buf, size_t n) { template future output_stream_buffer::flush() { + if (!_end) { + return make_ready_future(true); + } promise pr; auto fut = pr.get_future(); - if (!_end) { + _fd.write_all(_buf.get(), _end).then( + [this, pr = std::move(pr)] (size_t done) mutable { + _end = 0; pr.set_value(true); - } else { - _fd.write_all(_buf.get(), _end).then( - [this, pr = std::move(pr)] (size_t done) mutable { - _end = 0; - pr.set_value(true); - }); - } + }); return fut; }