]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
crimson/common: add new facilities to interruptible future
authorXuehan Xu <xxhdx1985126@gmail.com>
Thu, 13 May 2021 08:52:11 +0000 (16:52 +0800)
committerXuehan Xu <xxhdx1985126@gmail.com>
Sun, 16 May 2021 06:47:56 +0000 (14:47 +0800)
Signed-off-by: Xuehan Xu <xxhdx1985126@gmail.com>
src/crimson/common/interruptible_future.h

index e2cb8b541026cd5ebe74b46fe7384fd4515e807f..5c64a514bcb13209dce975ff99f274283eeb59e5 100644 (file)
@@ -669,6 +669,22 @@ public:
     return (interrupt_futurize_t<decltype(fut)>)(std::move(fut));
   }
 
+  template <typename ValFuncT, typename ErrorFuncT>
+  [[gnu::always_inline]]
+  auto safe_then_unpack_interruptible(ValFuncT&& func, ErrorFuncT&& errfunc) {
+    return safe_then_interruptible([func=std::forward<ValFuncT>(func)](T&& tuple) mutable {
+      return std::apply(std::forward<ValFuncT>(func), std::move(tuple));
+    }, std::forward<ErrorFuncT>(errfunc));
+  }
+
+  template <typename ValFuncT>
+  [[gnu::always_inline]]
+  auto safe_then_unpack_interruptible(ValFuncT&& func) {
+    return safe_then_interruptible([func=std::forward<ValFuncT>(func)](T&& tuple) mutable {
+      return std::apply(std::forward<ValFuncT>(func), std::move(tuple));
+    });
+  }
+
   template <bool interruptible = true, typename ValueInterruptCondT,
            typename U = T, std::enable_if_t<!std::is_void_v<T> && interruptible, int> = 0>
   [[gnu::always_inline]]
@@ -707,6 +723,22 @@ public:
                            std::forward<ErrorVisitorTailT>(err_func_tail)...));
   }
 
+  template <typename ValFuncT,
+           typename ErrorVisitorHeadT,
+           typename... ErrorVisitorTailT>
+  [[gnu::always_inline]]
+  auto safe_then_unpack_interruptible_tuple(
+      ValFuncT&& valfunc,
+      ErrorVisitorHeadT&& err_func_head,
+      ErrorVisitorTailT&&... err_func_tail) {
+    return safe_then_interruptible_tuple(
+      [valfunc=std::forward<ValFuncT>(valfunc)](T&& tuple) mutable {
+      return std::apply(std::forward<ValFuncT>(valfunc), std::move(tuple));
+    },
+    ::crimson::composer(std::forward<ErrorVisitorHeadT>(err_func_head),
+                       std::forward<ErrorVisitorTailT>(err_func_tail)...));
+  }
+
   template <bool interruptible = true, typename ErrorFunc>
   auto handle_error_interruptible(ErrorFunc&& errfunc) {
     if constexpr (interruptible) {
@@ -830,6 +862,14 @@ public:
              seastar::future<>>(seastar::now());
   }
 
+  template <typename ValueT = void, typename... A>
+  [[gnu::always_inline]]
+  static interruptible_future_detail<InterruptCond, seastar::future<ValueT>>
+  make_ready_future(A&&... value) {
+    return interruptible_future_detail<InterruptCond, seastar::future<ValueT>>(
+       seastar::make_ready_future<ValueT>(std::forward<A>(value)...));
+  }
+
   template <typename T>
   struct futurize {
     using type = interruptible_future_detail<