Add make_ready_future() helper when no async work needs to be done

Use where applicable.
This commit is contained in:
Avi Kivity
2014-08-18 16:59:25 +03:00
parent ccb052a418
commit 2207e8e5f3
3 changed files with 35 additions and 15 deletions

View File

@@ -147,12 +147,11 @@ public:
});
}
future<size_t> write_response_headers(std::unordered_map<sstring, sstring>::iterator hi) {
if (hi == _resp->_headers.end()) {
return make_ready_future<size_t>(0);
}
promise<size_t> 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);

View File

@@ -23,9 +23,7 @@ future<void> reactor::get_epoll_future(pollable_fd_state& pfd,
promise<void> pollable_fd_state::*pr, int event) {
if (pfd.events_known & event) {
pfd.events_known &= ~event;
promise<void> pr;
pr.set_value();
return pr.get_future();
return make_ready_future();
}
pfd.events_requested |= event;
if (!(pfd.events_epoll & event)) {

View File

@@ -52,6 +52,11 @@ class promise;
template <class T>
class future;
template <typename T>
future<T> make_ready_future(T&& value);
future<void> make_ready_future();
class task {
public:
virtual ~task() {}
@@ -157,6 +162,7 @@ struct future_state {
make_ready();
}
}
friend future<T> make_ready_future<T>(T&& value);
};
template <>
@@ -219,6 +225,7 @@ struct future_state<void> {
make_ready();
}
}
friend future<void> make_ready_future();
};
template <typename T>
@@ -335,6 +342,7 @@ public:
}
friend class promise<T>;
friend future<T> make_ready_future<T>(T&& value);
};
template <>
@@ -398,6 +406,7 @@ public:
}
friend class promise<void>;
friend future<void> make_ready_future();
};
template <typename T>
@@ -417,6 +426,21 @@ promise<void>::get_future()
return future<void>(_state);
}
template <typename T>
inline
future<T> make_ready_future(T&& value) {
auto s = new future_state<T>();
s->set(std::move(value));
return future<T>(s);
}
inline
future<void> make_ready_future() {
auto s = new future_state<void>();
s->set();
return future<void>(s);
}
using accept_result = std::tuple<pollable_fd, socket_address>;
struct listen_options {
@@ -850,17 +874,16 @@ output_stream_buffer<CharType>::write(const char_type* buf, size_t n) {
template <typename CharType>
future<bool>
output_stream_buffer<CharType>::flush() {
if (!_end) {
return make_ready_future(true);
}
promise<bool> 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;
}