Add make_ready_future() helper when no async work needs to be done
Use where applicable.
This commit is contained in:
7
httpd.cc
7
httpd.cc
@@ -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);
|
||||
|
||||
@@ -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)) {
|
||||
|
||||
39
reactor.hh
39
reactor.hh
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user