24 #include <seastar/util/concepts.hh>
25 #include <seastar/util/modules.hh>
26 #include <seastar/util/noncopyable_function.hh>
27 #include <seastar/util/optimized_optional.hh>
28 #include <seastar/util/std-compat.hh>
30 #ifndef SEASTAR_MODULE
31 #include <boost/intrusive/list.hpp>
34 #include <type_traits>
38 namespace bi = boost::intrusive;
42 SEASTAR_MODULE_EXPORT_BEGIN
51 virtual const char* what()
const noexcept
override {
52 return "abort requested";
67 class subscription :
public bi::list_base_hook<bi::link_mode<bi::auto_unlink>> {
73 : _target(std::move(target)) {
74 as._subscriptions.push_back(*
this);
77 struct naive_cb_tag {};
79 : _target([cb = std::move(naive_cb)] (
const std::optional<std::exception_ptr>&) noexcept { cb(); }) {
80 as._subscriptions.push_back(*
this);
83 void on_abort(
const std::optional<std::exception_ptr>& ex) noexcept {
91 : _target(std::move(other._target)) {
92 subscription_list_type::node_algorithms::swap_nodes(other.this_ptr(), this_ptr());
95 subscription& operator=(
subscription&& other) noexcept(std::is_nothrow_move_assignable_v<subscription_callback_type>) {
97 _target = std::move(other._target);
99 subscription_list_type::node_algorithms::swap_nodes(other.this_ptr(), this_ptr());
104 explicit operator bool()
const noexcept {
110 using subscription_list_type = bi::list<subscription, bi::constant_time_size<false>>;
111 subscription_list_type _subscriptions;
112 std::exception_ptr _ex;
114 void do_request_abort(std::optional<std::exception_ptr> ex) noexcept {
120 auto subs = std::move(_subscriptions);
121 while (!subs.empty()) {
129 abort_source() =
default;
130 virtual ~abort_source() =
default;
132 abort_source(abort_source&&) =
default;
133 abort_source& operator=(abort_source&&) =
default;
139 template <
typename Func>
141 requires (std::is_nothrow_invocable_r_v<
void, Func,
const std::optional<std::exception_ptr>&> ||
142 std::is_nothrow_invocable_r_v<void, Func>))
148 if constexpr (std::is_invocable_v<Func, std::exception_ptr>) {
151 return {
subscription(subscription::naive_cb_tag{}, *
this, std::forward<Func>(f)) };
159 do_request_abort(std::nullopt);
166 do_request_abort(std::make_optional(std::move(ex)));
172 template <
typename Exception>
174 do_request_abort(std::make_optional(std::make_exception_ptr(std::forward<Exception>(e))));
186 std::rethrow_exception(_ex);
199 SEASTAR_MODULE_EXPORT_END
Definition: abort_source.hh:49
Definition: abort_source.hh:67
Definition: abort_source.hh:59
virtual std::exception_ptr get_default_exception() const noexcept
Definition: abort_source.hh:192
void check() const
Throws a abort_requested_exception if cancellation has been requested.
Definition: abort_source.hh:184
void request_abort_ex(std::exception_ptr ex) noexcept
Definition: abort_source.hh:165
void request_abort_ex(Exception &&e) noexcept
Definition: abort_source.hh:173
optimized_optional< subscription > subscribe(Func &&f)
Definition: abort_source.hh:144
void request_abort() noexcept
Definition: abort_source.hh:158
bool abort_requested() const noexcept
Returns whether an abort has been requested.
Definition: abort_source.hh:178
Definition: optimized_optional.hh:53
Definition: stream.hh:128
Seastar API namespace.
Definition: abort_on_ebadf.hh:26
Definition: noncopyable_function.hh:37