26#include <seastar/core/future.hh>
27#include <seastar/util/assert.hh>
28#include <seastar/util/defer.hh>
36template <
typename Object>
37concept closeable =
requires (Object o) {
38 { o.close() } SEASTAR_DEFERRED_ACTION_NOEXCEPT -> std::same_as<future<>>;
48template <
typename Object>
49requires closeable<Object>
51 std::reference_wrapper<Object> _obj;
54 void do_close()
noexcept {
57 _obj.get().close().get();
74 _closed = std::exchange(x._closed,
true);
83 SEASTAR_ASSERT(!_closed);
94template <closeable Closeable, std::invocable<Closeable&> Func>
95requires std::is_nothrow_move_constructible_v<Closeable> && std::is_nothrow_move_constructible_v<Func>
96inline futurize_t<std::invoke_result_t<Func, Closeable&>>
97with_closeable(Closeable&& obj, Func func)
noexcept {
98 return do_with(std::move(obj), [func = std::move(func)] (Closeable& obj)
mutable {
99 return futurize_invoke(func, obj).finally([&obj] {
105template <
typename Object>
106concept stoppable =
requires (Object o) {
107 { o.stop() } SEASTAR_DEFERRED_ACTION_NOEXCEPT -> std::same_as<future<>>;
117template <
typename Object>
118requires stoppable<Object>
120 std::reference_wrapper<Object> _obj;
121 bool _stopped =
false;
123 void do_stop()
noexcept {
126 _obj.get().stop().get();
143 _stopped = std::exchange(x._stopped,
true);
152 SEASTAR_ASSERT(!_stopped);
163template <stoppable Stoppable, std::invocable<Stoppable&> Func>
164requires std::is_nothrow_move_constructible_v<Stoppable> && std::is_nothrow_move_constructible_v<Func>
165inline futurize_t<std::invoke_result_t<Func, Stoppable&>>
166with_stoppable(Stoppable&& obj, Func func)
noexcept {
167 return do_with(std::move(obj), [func = std::move(func)] (Stoppable& obj)
mutable {
168 return futurize_invoke(func, obj).finally([&obj] {
Definition: closeable.hh:50
void close_now() noexcept
Close obj once now.
Definition: closeable.hh:82
deferred_close & operator=(deferred_close &&x) noexcept
Definition: closeable.hh:71
void cancel() noexcept
Definition: closeable.hh:89
deferred_close(deferred_close &&x) noexcept
Definition: closeable.hh:66
~deferred_close()
Destruct the deferred_close object and auto-close obj.
Definition: closeable.hh:78
deferred_close(Object &obj) noexcept
Definition: closeable.hh:63
Definition: closeable.hh:119
deferred_stop(Object &obj) noexcept
Definition: closeable.hh:132
void stop_now() noexcept
Stop obj once now.
Definition: closeable.hh:151
deferred_stop(deferred_stop &&x) noexcept
Definition: closeable.hh:135
~deferred_stop()
Destruct the deferred_stop object and auto-stop obj.
Definition: closeable.hh:147
void cancel() noexcept
Definition: closeable.hh:158
deferred_stop & operator=(deferred_stop &&x) noexcept
Definition: closeable.hh:140
auto do_with(T1 &&rv1, T2 &&rv2, More &&... more) noexcept
Definition: do_with.hh:135
Seastar API namespace.
Definition: abort_on_ebadf.hh:26