24 #ifndef SEASTAR_MODULE
25 #include <seastar/core/future.hh>
26 #include <seastar/core/chunked_fifo.hh>
31 #include <seastar/core/lowres_clock.hh>
32 #include <seastar/core/timed_out_error.hh>
33 #include <seastar/util/modules.hh>
40 void operator()(T&) noexcept {};
43 template<
typename... T>
59 template <
typename T,
typename OnExpiry = dummy_expiry<T>,
typename Clock = lowres_clock>
63 using time_point =
typename Clock::time_point;
66 std::optional<T> payload;
68 entry(T&& payload_) : payload(std::move(payload_)) {}
69 entry(
const T& payload_) : payload(payload_) {}
71 : payload(std::move(payload_))
73 ef._on_expiry(*payload);
74 payload = std::nullopt;
76 ef.drop_expired_front();
81 entry(entry&& x) =
delete;
82 entry(
const entry& x) =
delete;
89 std::unique_ptr<entry> _front;
97 void drop_expired_front() noexcept {
98 while (!_list.empty() && !_list.front().payload) {
101 if (_front && !_front->payload) {
107 expiring_fifo(OnExpiry on_expiry) noexcept(std::is_nothrow_move_constructible_v<OnExpiry>) : _on_expiry(std::move(on_expiry)) {}
112 assert(o._size == 0);
133 explicit operator bool() const noexcept {
141 return *_front->payload;
143 return *_list.front().payload;
150 return *_front->payload;
152 return *_list.front().payload;
167 return _list.reserve(
size);
174 _front = std::make_unique<entry>(payload);
176 _list.emplace_back(payload);
185 _front = std::make_unique<entry>(std::move(payload));
187 _list.emplace_back(std::move(payload));
196 if (timeout == time_point::max()) {
201 _front = std::make_unique<entry>(std::move(payload), *
this, timeout);
203 _list.emplace_back(std::move(payload), *
this, timeout);
217 drop_expired_front();
Definition: expiring_fifo.hh:60
bool empty() const noexcept
Definition: expiring_fifo.hh:128
size_t size() const noexcept
Definition: expiring_fifo.hh:158
void pop_front() noexcept
Definition: expiring_fifo.hh:210
void push_back(const T &payload)
Definition: expiring_fifo.hh:172
T & front() noexcept
Definition: expiring_fifo.hh:139
const T & front() const noexcept
Definition: expiring_fifo.hh:148
void reserve(size_t size)
Definition: expiring_fifo.hh:166
void push_back(T &&payload)
Definition: expiring_fifo.hh:183
void push_back(T &&payload, time_point timeout)
Definition: expiring_fifo.hh:195
void set_exception(std::exception_ptr &&ex) noexcept
Marks the promise as failed.
Definition: future.hh:990
Definition: timed_out_error.hh:33
void arm(time_point until, std::optional< duration > period={}) noexcept
Seastar API namespace.
Definition: abort_on_ebadf.hh:26
Definition: expiring_fifo.hh:39
Definition: expiring_fifo.hh:44